如果有人可以给我一个提示如何从不同列中的文本行获取数据。我将在下面举个例子。 非常感谢
我有一个名为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?
谢谢你的帮助
答案 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 |
+--------------+----------------+