2017-04-10 4 views
1

誰かが私に、異なる列のテキストを持つ行からデータを取得する方法を教えてもらうことができたら、私は下の例を持っています。SQL:テキストを異なる列の行からどのように分割するのですか?

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

望ましい結果:2つの異なるCOLUMNS SQLにこれを翻訳する方法

SCHEMA_NAME  TABLE_NAME 
USER_SCHEMA1 T_POSTAL_CODES 
USER_SCHEMA2 T_USER_NAMES 
USER_SCHEMA3 T_LOCATIONS 

を が多く、私が含まれている列と呼ばれるテキストを持っている

を高く評価しますか?

これはALL_SOURCEから必要なものですが、TEXT列を2つの列に1つのSCHEMA_NAMEと1つの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? 

あなたは文字列の最初の期間の位置および/またはスペースを見つけることcharindex()substring()stuff()を使用して

答えて

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

関連する問題