Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 SQL将字符串解析到表中_Sql_Oracle_Plsql_Oracle9i - Fatal编程技术网

使用oracle SQL将字符串解析到表中

使用oracle SQL将字符串解析到表中,sql,oracle,plsql,oracle9i,Sql,Oracle,Plsql,Oracle9i,伙计们。假设我有下表: ID | String ---+--------- 1 | <123><345> 2 | <1-2><45-67> 3 | <345-321><234> 这是我的应用程序中的传统数据格式,目前无法避免。我需要做的是: ID | String ---+--------- 1 | <123> 1 | <345> 2 | <1-2>

伙计们。假设我有下表:

ID | String
---+---------  
1  | <123><345>  
2  | <1-2><45-67>  
3  | <345-321><234>
这是我的应用程序中的传统数据格式,目前无法避免。我需要做的是:

ID | String
---+---------
1  | <123>  
1  | <345>  
2  | <1-2>  
2  | <45-67>  
3  | <345-321>  
3  | <234>  
关于如何仅使用普通Oracle SQL而不创建任何其他对象或pl SQL过程来实现此结果,有何建议


谢谢。

< p>无论如何,如果你考虑使用存储过程,试试这个:

资料来源:


如果您考虑使用存储过程,尝试这个:

资料来源:

试试这个:

SELECT Id, SUBSTR(String,1,INSTR(String,'>',1,1)) FROM MyTable
UNION ALL
SELECT Id, SUBSTR(String,INSTR(String,'<',1,2)) FROM MyTable
我是MS SQL Server用户,因此我不确定它是否有效,但请告诉我…

尝试以下方法:

SELECT Id, SUBSTR(String,1,INSTR(String,'>',1,1)) FROM MyTable
UNION ALL
SELECT Id, SUBSTR(String,INSTR(String,'<',1,2)) FROM MyTable
select id, string
  ,substr(string, instr(string, '<', 1, element_number)
    ,instr(string, '>', 1, element_number) - instr(string, '<', 1, element_number) + 1) result
from test
cross join
(
  select level element_number from dual connect by level <=
    (select max(length(string) - length(replace(string, '<', null))) max_elements from test)
) extra_rows
where element_number <= length(string) - length(replace(string, '<', null))
order by id, element_number;


我是MS SQL Server用户,因此我不确定它是否能正常工作,但请告诉我……

如果没有存储过程,我认为您无法做到这一点。据我所知,Oracle中没有任何内置函数可以执行此操作。您使用的是Oracle的哪个版本?另一个问题:是否要使用此旧表的内容填充新表?另外,您要求在没有其他对象的情况下执行此操作是一个愿望还是一个铁铸的约束?问题是,我没有创建任何新表;我将这些数据用作报告的一部分,它本身非常简单,只需使用普通sql即可完成,无需任何过程处理。所以,我不想用任何新对象来破坏我的数据库,我想这是不值得的。但无论如何,是的,我的请求只是一个愿望。事实上,这很好,但在9i中似乎不起作用我认为如果没有存储过程,就无法做到这一点。据我所知,Oracle中没有任何内置函数可以执行此操作。您使用的是Oracle的哪个版本?另一个问题:是否要使用此旧表的内容填充新表?另外,您要求在没有其他对象的情况下执行此操作是一个愿望还是一个铁铸的约束?问题是,我没有创建任何新表;我将这些数据用作报告的一部分,它本身非常简单,只需使用普通sql即可完成,无需任何过程处理。所以,我不想用任何新对象来破坏我的数据库,我想这是不值得的。但无论如何,是的,我的请求只是一个愿望。事实上,这很好,但在9i中似乎不起作用如果我的行中的数据不超过两条,它就可以工作,但我可以有三条或更多条,所以我想每次写N个联合是不可能的哦所以你也可以有??是的,我可以,我没有关于每条线有多少块的信息。我所知道的不少于一行,每行最多六到七行。见Jon Earle上面的答案-你可以采取类似的方法,对一个返回N行的假表进行笛卡尔连接,其中N是数据项的计数,然后使用计数来驱动INSTR的偏移量。如果我的行中的数据不超过两个,那么它是有效的,但是我可以有三个或更多,所以我想每次写N个并集是不可能的哦所以你也可以有??是的,我可以,我没有关于每条线有多少块的信息。我所知道的不少于一行,每行最多六到七行。见Jon Earle上面的答案-你可以采取类似的方法,对一个返回N行的假表进行笛卡尔连接,其中N是数据项的计数,然后使用计数来驱动INSTR的偏移量。+1-这样做不需要任何额外的对象。值得解释的是,在这个connect by level子句中,从dual connect by level子查询中选择level元素\u number不起作用,但是,当我用常量替换它时,它就可以了。这对我来说是可行的,谢谢。@behernow-这种使用CONNECT BY语法而不使用PREVIOR子句的做法在9i中是有争议的,因为它没有文档记录,并且在数据库的所有版本中都不完全相同,有时我们不得不将内容用额外的括号括起来。但Jon的代码在我的11g数据库中运行顺利。它似乎是“Kyte批准的”,即尽管没有记录,它已经在一些AskTom答案中使用-我怀疑Oracle现在是否会更改/删除该行为。+1-这可以在不需要任何其他对象的情况下完成工作。值得解释的是,在这个connect by level子句中,从dual connect by level子查询中选择level element_number不起作用,但是,当我用常量替换它时,它就行了。这对我来说是可行的,谢谢。@behernow-这种使用CONNECT BY语法而不使用PREVIOR子句的做法在9i中是有争议的,因为它没有文档记录,并且在数据库的所有版本中都不完全相同,有时我们不得不将内容用额外的括号括起来。但是Jon的代码在我的11g数据库中运行得很顺利。它似乎是“Kyte批准的”,即尽管没有记录,但它已经在一些AskTom答案中使用过——我怀疑Oracle现在是否会改变/删除该行为。
select id, string
  ,substr(string, instr(string, '<', 1, element_number)
    ,instr(string, '>', 1, element_number) - instr(string, '<', 1, element_number) + 1) result
from test
cross join
(
  select level element_number from dual connect by level <=
    (select max(length(string) - length(replace(string, '<', null))) max_elements from test)
) extra_rows
where element_number <= length(string) - length(replace(string, '<', null))
order by id, element_number;