【问题标题】:Oracle find values in varcharOracle 在 varchar 中查找值
【发布时间】:2015-07-08 10:14:11
【问题描述】:

是否有机会使用 oracle sql 在 varchar 中找到精确值?

我需要在字符串中找到一个准确的值(见输出)。

这是我的 sql 输出:

Rights (varchar)
-----
#1  ( ID IN ( 1560 , 1760 , 1860 , 20200 , 3530, 16000 ) ) 
#2  ( ID IN ( 1600 , 20000 , 100000 ) ) 

我想过滤例如字符串16001660

在这种情况下,应该只显示#2

我尝试了and table1.rights like '%1600%',这当然不起作用,因为它也向我显示了#1,这是错误的。

我还发现了这个关于使用我无法集成的拆分

http://lalitkumarb.com/2014/12/02/split-comma-delimited-string-into-rows-using-oracle-sql/

有什么想法吗?

【问题讨论】:

  • 你可以拆分你的字符串,但like '% 1600 %' 不起作用(带空格)?
  • 不需要拆分字符串,LIKE '% 1600 %' 可以正常工作。

标签: sql oracle split


【解决方案1】:

我还发现了这个关于使用我无法集成的拆分

http://lalitkumarb.com/2014/12/02/split-comma-delimited-string-into-rows-using-oracle-sql/

很高兴看到有人关注我的博客和文章 :-)

不需要拆分字符串,使用 LIKE 按以下方式只考虑1600之前/之后的空格,不考虑其他字符:

SQL> WITH DATA(str) AS(
  2  SELECT '#1  ( ID IN ( 1560 , 1760 , 1860 , 20200 , 3530, 16000 ) )' FROM dual UNION ALL
  3  SELECT '#2  ( ID IN ( 1600 , 20000 , 100000 ) )' FROM DUAL
  4  )
  5  SELECT * FROM DATA
  6  WHERE str LIKE '% 1600 %';

STR
----------------------------------------------------------
#2  ( ID IN ( 1600 , 20000 , 100000 ) )

SQL>

【讨论】:

  • 再次感谢您的帮助 - 到目前为止,您的博客对我帮助很大!我是一名实习生,可悲的是,没有人真正帮助我——很抱歉有时会问一些愚蠢的问题!继续写博客! :)
【解决方案2】:

了解您的 Oracle 数据库版本是否支持REGEXP_LIKE(类似于 LIKE)。 你可以在里面写一个正则表达式,something 像这样,

SELECT * FROM table1 WHERE REGEXP_LIKE (rights, ' (,|[:blank:]|\()16(00|60)(,|[:blank:]|\))');

编辑:我只是改进了 cmets 之后的 reg 表达式。 即使缺少一些空间也可以使用。要搜索任何其他值,您只需更改表达式中间的值部分

也见regular expression syntax

【讨论】:

  • 您的模式中缺少右括号和外部方括号 - 所以 '16(00|60)(,|[[:blank:]])' 可以工作。但它也会匹配,例如 11600,因此您还需要检查所需值之前的值。
  • 如果oracle支持单词边界运算符\b,正则表达式匹配会更简单。另请注意,@Alex 注释是正确的,您需要在表达式的开头进行边界检查。
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多