2017-04-10 47 views
1

如果有人可以給我一個提示如何從一行中獲取不同列中的文本的數據。我將在下面舉一個例子。 非常感謝SQL:如何從不同列中的行中劃分文本?

我有一個名爲TEXT列包含:

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

期望的結果:兩個不同的列

SCHEMA_NAME  TABLE_NAME 
USER_SCHEMA1 T_POSTAL_CODES 
USER_SCHEMA2 T_USER_NAMES 
USER_SCHEMA3 T_LOCATIONS 

如何轉換成SQL呢?

這是我需要從ALL_SOURCE,但列TEXT把它放在兩列一個SCHEMA_NAME和一個TABLE_NAME。

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? 

感謝您使用substring()stuff()charindex()找到字符串中的第一期和/或空間位置幫助

回答

1

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 .... fixed。 –

相關問題