Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写oracle查询以将字符串拆分为按类别相关的多行_Oracle - Fatal编程技术网

如何编写oracle查询以将字符串拆分为按类别相关的多行

如何编写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

我不熟悉我的工作。。 我正在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          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, '#', '","') || '"'))