2017-04-10 1 views
1

누군가가 다른 열의 텍스트가있는 행에서 데이터를 가져 오는 방법을 알 수 있다면. 나는 아래 예를 가질 것이다.SQL : 다른 열의 행에서 텍스트를 나누는 방법은 무엇입니까?

TEXT 
<FROM> USER_SCHEMA1.T_POSTAL_CODES 
<FROM> USER_SCHEMA2.T_USER_NAMES 
<FROM> USER_SCHEMA3.T_LOCATIONS 

원하는 결과 : SQL로이 번역하는 방법 두 가지 COLUMNS

SCHEMA_NAME  TABLE_NAME 
USER_SCHEMA1 T_POSTAL_CODES 
USER_SCHEMA2 T_USER_NAMES 
USER_SCHEMA3 T_LOCATIONS 

는 많은 I에 포함 된 텍스트라는 열이

감사?

이것은 내가 ALL_SOURCE에서 필요로하는 것이지만 TEXT 열은 하나의 SCHEMA_NAME과 하나의 TABLE_NAME을 두 개의 열에 넣는 것입니다. 당신은 문자열의 첫 번째 기간 및/또는 공간의 위치를 ​​찾기 위해 substring()charindex()stuff()를 사용

답변

1

을 도움을

select * from ALL_SOURCE S 
where S.OWNER_NAME like 'FINANCE_SCHEMA%' -- in order to be on the right schema 
and S.TEXT like '<FROM%'; -- what to use next? 

감사합니다.

select 
    schema_name = substring([text] 
     , charindex(' ',[text])+1 
     , charindex('.',[text])-(charindex(' ',[text])+1) 
    ) 
    , table_name = stuff([text],1,charindex('.',[text]),'') 
from t 

rextester 데모 : http://rextester.com/EEMU6399

반환 :

+--------------+----------------+ 
| schema_name | table_name | 
+--------------+----------------+ 
| USER_SCHEMA1 | T_POSTAL_CODES | 
| USER_SCHEMA2 | T_USER_NAMES | 
| USER_SCHEMA3 | T_LOCATIONS | 
+--------------+----------------+ 
2

당신은 아주 쉽게이에 대한 PARSENAME을 활용할 수 있습니다. 예약어를 열 이름으로 사용하지 않는 것이 좋습니다. 코드가 필요한 것보다 훨씬 어려워집니다.

with MyTextTable as 
(
    select MyText = '<FROM> USER_SCHEMA1.T_POSTAL_CODES' union all 
    select '<FROM> USER_SCHEMA2.T_USER_NAMES' union all 
    select '<FROM> USER_SCHEMA3.T_LOCATIONS' 
) 

select * 
    , [SCHEMA_NAME] = parsename(REPLACE(MyText, '<FROM> ', ''), 2) 
    , TABLE_NAME = parsename(REPLACE(MyText, '<FROM> ', ''), 1) 
from MyTextTable 
+0

@SqlZim oops .... 고정. –

관련 문제