如何编写oracle查询以将字符串拆分为按类别相关的多行
我不熟悉我的工作。。 我正在Visual Studio数据工具上构建SSAS模型。。 我面临的最复杂的问题之一是一个字段包含多个值,我需要将每个值连接到另一个表,例如如何编写oracle查询以将字符串拆分为按类别相关的多行,oracle,Oracle,我不熟悉我的工作。。 我正在Visual Studio数据工具上构建SSAS模型。。 我面临的最复杂的问题之一是一个字段包含多个值,我需要将每个值连接到另一个表,例如 Family PersonsID 1 1#2#5 2 6#7#10 我想要一个查询,而不是一个plsql程序,使它成为这种形式 Family PersonsID 1 1 1 2 1 5 2 6 2
Family PersonsID
1 1#2#5
2 6#7#10
我想要一个查询,而不是一个plsql程序,使它成为这种形式
Family PersonsID
1 1
1 2
1 5
2 6
2 7
2 10
把它和桌子绑在一起。
我发现了这个天才的疑问
SELECT A.[Family],
Split.a.value('.', 'VARCHAR(100)') AS String
FROM (SELECT [State],
CAST ('<M>' + REPLACE([PersonsID], '#', '</M><M>') + '</M>' AS XML) AS String
FROM TableA) AS A CROSS APPLY String.nodes ('/M') AS Split(a);
它的工作完全符合我的要求,但只在SQL server上运行。当我在Oracle 11g上试用时
它给了我一个错误:应该在交叉后加入
你能帮我吗。。我需要它作为查询,因为我没有权限根据客户机策略在数据库上创建函数和过程,我需要尽快使用它SQL Server和Oracle 11g是非常不同的RDBMS,支持不同的语法,ANSI标准部分除外,因此不能使用交叉应用和XML
但您可以改用regexp\u substr:
对于长度超过一个字符的delimeters,可以使用稍微修改的查询
编辑:
DISTINCT将删除重复项,以便
PersonsID
1#1#2#5
=> 1
2
5
要获取具有重复项的所有值,请删除DISTINCT:
下面是实现相同结果的另一种方法
SELECT family , trim(COLUMN_VALUE) PersonsID
FROM table1, xmltable(('"' || REPLACE(PersonsID, '#', '","') || '"'))
Oracle中有几种不同的字符串标记方法。谢谢你,效果非常好。。但我不明白为什么查询中的distinct?@ray distinct用于从1125 like中删除重复项。如果要复制值,请删除DISTINCT。
PersonsID
1#1#2#5
=> 1
2
5
=> 1
1
2
5
SELECT family , trim(COLUMN_VALUE) PersonsID
FROM table1, xmltable(('"' || REPLACE(PersonsID, '#', '","') || '"'))