0

我有一列varchar2包含以下数据:....[A1]...[A2]... 我想取出所有封装的数据,这些数据[]以字母开头,可以有一个或两个数字,即:[B1][B23]

所以我想要这样的东西:“WHERE 列就像'[__]' OR column is like '[___]'_不是任何值,而是字母或数字。

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

4

2 回答 2

1

好问题!这是一个 Fiddle,展示了如何将匹配项查询到结果集中。

如果 Fiddle 中的查询没有意义,这里有很长的解释:)

我正在使用一个名为RegEx_Testcolumn的表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]

你的正则表达式是这样的:\[[[:alpha:]][[:digit:]]{1,2}\]. :alpha:除了 POSIX和指标外,它与其他答案相同,在:digit:国际字符集的情况下更安全。

首先,您需要知道任何一行的最大匹配数。用于REGEXP_COUNT此:

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

MAX(REGEXP_COUNT(My...
----------------------
                     6

使用该最大计数来获取一个“计数器”表(SELECT ... FROM DUAL如下所示),并将计数器表与一个查询交叉连接,该查询将使用REGEXP_SUBSTR. REGEXP_SUBSTR有一个“发生”参数,它将使用Counter

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

这是针对我的表运行的示例(部分结果):

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

这是 Fiddle 上的查询,它可以在另一个查询中使用。

于 2013-03-15T16:24:29.230 回答
1

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

[...] WHERE REGEXP(col_name, '\[[A-Z][0-9]{1,2}\]');
于 2013-03-15T14:12:51.287 回答