在 Oracle 中使用 regexp_like 使用一系列值匹配多个字符串条件
Using regexp_like in Oracle to match on multiple string conditions using a range of values
我的 Oracle 数据库中有一个包含代码的字段,我需要使用一系列值从中提取多个值。
例如,我需要提取 C00.0 - C39.9
范围内的所有代码,即以 C 开头,第二个字符可以是 0-3,第三个字符是 0-9,后跟一个“.”然后最后一位数字是 0-9 例如
CODES
-----
C00.0
C10.4
C15.8
C39.8
上面的例子是一个模式,我有多个模式要匹配,这里是另一个例子
C50.011-C69.92
同样,以C开头,第二个字符是5-6,第三个是0-9,第四个是“.”,第五个是0-9,第六个是1-2等等
我尝试了以下方法,但我的管道函数似乎没有选择第二个条件,因此我只得到第一个条件的结果 '^[C][0-3][0-9][.][0-9]'
:
SELECT DISTINCT CODES
FROM
TABLE
WHERE REGEXP_LIKE (CODES, '^[C][0-3][0-9][.][0-9]|
^[C][4][0-3][.][0-9]|
^[C][4][A][.][0-9]|
^[C][4][4-9][.][0-9]|
^[C][4][9][.][A][0-9]|
^[C][5-6][0-9][.][0-9][1-9]|
^[C][7][0-5][.][0-9]|
^[C][7][A-B][.][0-8]')
ORDER BY CODES
如果有人可以就如何拉出额外的模式提出建议,我将不胜感激。
您的模式中有换行符 -- 换句话说,您对可读性的尝试导致了问题。您可以删除它们,尽管我可能会排除常见元素:
WHERE REGEXP_LIKE (CODES, '^[C]([0-3][0-9][.][0-9]|[4][0-3][.][0-9]|[4][A][.][0-9]|[4][4-9][.][0-9]|[4][9][.][A][0-9]|[5-6][0-9][.][0-9][1-9]|[7][0-5][.][0-9]|[7][A-B][.][0-8])')
我想你也想要 $
最后。
如果你想要可读性,你可以使用 or
:
SELECT DISTINCT CODES
FROM TABLE
WHERE REGEXP_LIKE (CODES, '^[C][0-3][0-9][.][0-9]') OR
REGEXP_LIKE (CODES, '^[C][4][0-3][.][0-9]|') OR
. . .
这是您要在此处匹配的正则表达式模式:
^C[0-3][0-9][.][0-9]$
这将匹配 C00.0 - C39.9
的范围。如果你想匹配 other 范围,那么你需要与另一个模式交替来覆盖这些范围。
将此应用于您当前的查询:
SELECT DISTINCT CODES
FROM yourTable
WHERE REGEXP_LIKE (CODES, '^C[0-3][0-9][.][0-9]$');
我的 Oracle 数据库中有一个包含代码的字段,我需要使用一系列值从中提取多个值。
例如,我需要提取 C00.0 - C39.9
范围内的所有代码,即以 C 开头,第二个字符可以是 0-3,第三个字符是 0-9,后跟一个“.”然后最后一位数字是 0-9 例如
CODES
-----
C00.0
C10.4
C15.8
C39.8
上面的例子是一个模式,我有多个模式要匹配,这里是另一个例子
C50.011-C69.92
同样,以C开头,第二个字符是5-6,第三个是0-9,第四个是“.”,第五个是0-9,第六个是1-2等等
我尝试了以下方法,但我的管道函数似乎没有选择第二个条件,因此我只得到第一个条件的结果 '^[C][0-3][0-9][.][0-9]'
:
SELECT DISTINCT CODES
FROM
TABLE
WHERE REGEXP_LIKE (CODES, '^[C][0-3][0-9][.][0-9]|
^[C][4][0-3][.][0-9]|
^[C][4][A][.][0-9]|
^[C][4][4-9][.][0-9]|
^[C][4][9][.][A][0-9]|
^[C][5-6][0-9][.][0-9][1-9]|
^[C][7][0-5][.][0-9]|
^[C][7][A-B][.][0-8]')
ORDER BY CODES
如果有人可以就如何拉出额外的模式提出建议,我将不胜感激。
您的模式中有换行符 -- 换句话说,您对可读性的尝试导致了问题。您可以删除它们,尽管我可能会排除常见元素:
WHERE REGEXP_LIKE (CODES, '^[C]([0-3][0-9][.][0-9]|[4][0-3][.][0-9]|[4][A][.][0-9]|[4][4-9][.][0-9]|[4][9][.][A][0-9]|[5-6][0-9][.][0-9][1-9]|[7][0-5][.][0-9]|[7][A-B][.][0-8])')
我想你也想要 $
最后。
如果你想要可读性,你可以使用 or
:
SELECT DISTINCT CODES
FROM TABLE
WHERE REGEXP_LIKE (CODES, '^[C][0-3][0-9][.][0-9]') OR
REGEXP_LIKE (CODES, '^[C][4][0-3][.][0-9]|') OR
. . .
这是您要在此处匹配的正则表达式模式:
^C[0-3][0-9][.][0-9]$
这将匹配 C00.0 - C39.9
的范围。如果你想匹配 other 范围,那么你需要与另一个模式交替来覆盖这些范围。
将此应用于您当前的查询:
SELECT DISTINCT CODES
FROM yourTable
WHERE REGEXP_LIKE (CODES, '^C[0-3][0-9][.][0-9]$');