Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
Sql 查找varchar2()中的所有匹配项_Sql_Regex_Oracle - Fatal编程技术网

Sql 查找varchar2()中的所有匹配项

Sql 查找varchar2()中的所有匹配项,sql,regex,oracle,Sql,Regex,Oracle,我有一个varchar2列,它包含如下数据:…[A1]…[A2]。。。 我想取出由[]封装的所有数据,该[]以字母开头,可以有一个或两个数字,即:[B1],[B23] 所以我想要这样的东西:其中列类似于“[\uuuuz]”或者列类似于“[\uuuuuz]”,但它不仅仅是任何值,而是字母或数字 是否可以以某种方式存储它们以供以后使用?您可以使用它来查找与正则表达式匹配的值: [...] WHERE REGEXP(col_name, '\[[A-Z][0-9]{1,2}\]'); 好问题!显示如何

我有一个varchar2列,它包含如下数据:…[A1]…[A2]。。。 我想取出由[]封装的所有数据,该[]以字母开头,可以有一个或两个数字,即:[B1],[B23]

所以我想要这样的东西:其中列类似于“[\uuuuz]”或者列类似于“[\uuuuuz]”,但它不仅仅是任何值,而是字母或数字

是否可以以某种方式存储它们以供以后使用?

您可以使用它来查找与正则表达式匹配的值:

[...] WHERE REGEXP(col_name, '\[[A-Z][0-9]{1,2}\]');
好问题!显示如何将匹配项查询到结果集中

这里有一个很长的解释,以防小提琴中的查询没有意义:

我正在使用一个名为RegEx_Test的表和一个列MyVal。以下是表格的内容:

MyVal
------------------------------
[A1][abc][B23][D123]a33[bx5]
[Z15][ax0][B0][F13]R3
[X215][A3A][J99]F33F33G24[43][R3]
[Z99][c1][F3][d33]3x24[Y3][f13]
[9a][D41][Q39][XX12]B27[T03][J12]
整个regexp是:\[[:alpha:][[:digit:]{1,2}\]。除了POSIX:alpha:and:digit:indicator之外,它与另一个答案中的相同,这在国际字符集中更安全

首先,您需要知道任何行上的最大匹配数。为此使用REGEXP\u计数:

SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
  FROM Regex_Test

MAX(REGEXP_COUNT(My...
----------------------
                     6
使用该最大计数获得一个计数器表,该计数器表是SELECT。。。从下面的DUAL中,使用一个查询交叉连接计数器表,该查询将使用REGEXP\u SUBSTR提取您的值。REGEXP_SUBSTR有一个引用参数,该参数将使用计数器:

此时,您有一个单独匹配的结果集,加上一行少于最大匹配的空值。火柴的周围还有括号。用一个外部查询将整个过程包围起来,该查询将过滤掉空值并删除括号,这样您就有了最终列表:

SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
  SELECT
    MyVal,
    Counter,
    REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
  FROM Regex_Test
  CROSS JOIN (
     SELECT LEVEL Counter
     FROM DUAL
     CONNECT BY LEVEL <= (
       SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
       FROM Regex_Test)) Counters
) WHERE Matched IS NOT NULL

这是一个正在处理的查询,可以在另一个查询中使用。

[…]其中REGEXPcol_name,“[[A-Z][0-9]{1,2}]”;给出与REGEXP_类似的列名称“[[A-Z][0-9]{1,1}]”相同的结果。正如我解释的那样,第一个正则表达式操作查找2个数字,而第二个正则表达式操作查找一个数字。其中,REGEXP_类似col_name,[[A-E]{1}[0-9]{2}]'解决了这个问题!现在,它是存储[…]匹配项并在另一个查询中使用它们的一种方法吗?
MyVal                              Counter Matched
---------------------------------- ------- -------
[9a][D41][Q39][XX12]B27[T03][J12]        1 [D41]
[9a][D41][Q39][XX12]B27[T03][J12]        2 [Q39]
[9a][D41][Q39][XX12]B27[T03][J12]        3 [T03]
[9a][D41][Q39][XX12]B27[T03][J12]        4 [J12]
[9a][D41][Q39][XX12]B27[T03][J12]        5
[9a][D41][Q39][XX12]B27[T03][J12]        6
[A1][abc][B23][D123]a33[bx5]             1 [A1]
[A1][abc][B23][D123]a33[bx5]             2 [B23]
[A1][abc][B23][D123]a33[bx5]             3
... and so on - total is 30 rows
SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
  SELECT
    MyVal,
    Counter,
    REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
  FROM Regex_Test
  CROSS JOIN (
     SELECT LEVEL Counter
     FROM DUAL
     CONNECT BY LEVEL <= (
       SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
       FROM Regex_Test)) Counters
) WHERE Matched IS NOT NULL