SQL:如何从不同列中的行划分文本?

时间:2017-04-10 15:23:45

标签: sql sql-server

如果有人可以给我一个提示如何从不同列中的文本行获取数据。我将在下面举个例子。 非常感谢

我有一个名为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?

谢谢你的帮助

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用substring()stuff()charindex()一起查找字符串中第一个句点和/或空格的位置。

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    |
+--------------+----------------+