如何创建正则表达式来查询Oracle?

时间:2015-11-26 06:40:29

标签: regex oracle

我在Oracle DB中有表。例如tbl1。和1列。例如col1。我的col1 - 列文字类型。我需要选择文本为0的所有行,并在文本中出现一次。如果文本它包含> 1位数,我不需要它。例如,我需要这些行:

0
text0
0text
text 0 text
text0 text 

我不需要这些行

only text
0 0 
00
10
3243455
0text 1

我认为我需要正则表达式,但我不知道如何使用它们。

我写

select * from tbl1 t where regexp_like(t.col1,'[0]{1}')

但我只获得包含0

的行

2 个答案:

答案 0 :(得分:2)

[^0-9]*[0-9][^0-9]*

这意味着:任何非数字的任何次数,然后是一个数字恰好一次,然后是任何非数字的任何次数。

您可能需要添加^$以强制它匹配整个字符串:

^[^0-9]*[0-9][^0-9]*$

答案 1 :(得分:1)

根据Ilya Kogan的回答,您可以使用以下正则表达式获取所需的行:

WITH tbl1 AS (SELECT '0' col1 FROM dual
              UNION
              SELECT 'text0' col1 FROM dual
              UNION
              SELECT '0text' col1 FROM dual
              UNION
              SELECT 'text 0 text' col1 FROM dual
              UNION
              SELECT 'text0 text ' col1 FROM dual
              UNION
              SELECT 'only text' col1 FROM dual
              UNION
              SELECT '0 0' col1 FROM dual
              UNION
              SELECT '00' col1 FROM dual
              UNION
              SELECT '10' col1 FROM dual
              UNION
              SELECT '3243455' col1 FROM dual
              UNION
              SELECT '0text 1' col1 FROM dual)
SELECT COL1, REGEXP_SUBSTR(col1,'\A\D*0\D*\Z')
FROM tbl1
WHERE REGEXP_LIKE(col1,'\A\D*0\D*\Z')

其中:

  • \A是该行的开头。
  • \D是一个非数字字符。
  • 0是数字0的字符。
  • \Z是该行的结尾。
相关问题