【问题标题】:Match only Words in a column with list of words仅匹配包含单词列表的列中的单词
【发布时间】:2020-02-02 06:23:42
【问题描述】:

我有一个带有 Description 的表,其中可以有多个单词,我需要与一组单词进行比较(一组单词是使用 LISTAGG 函数从另一个查询中输出的)来检查单词是否描述列中是否存在。

例如,如果我的描述有如下文本,并与单词 PIN 比较,则仅返回第 3,4 行。

  1. 运输物品
  2. 管道项目
  3. 夹紧销
  4. 主轴销

【问题讨论】:

  • 您可以尝试将要比较的单词集插入到临时表中,然后使用类似条件stackoverflow.com/a/14125755/6070209 加入。
  • @AustinYi Like 不起作用,因为与 PIN 相比,SHIPPING 会带来结果

标签: sql oracle regexp-substr listagg regexp-like


【解决方案1】:

您可以使用正则表达式。以您为例:

select *
from (select 'SHIPPING ITEM' as col from dual union all
      select 'SPINDLE PIN' from dual
     ) x
where regexp_like(' ' || col || ' ', '\WPIN\W')

如果传入'PIN,BALL'这样的字符串,可以构造你想要的表达式:

where regexp_like(' ' || col || ' ', 
                  '\W' || replace('PIN,BALL', ',', '\W|\W') || '\W'
                 )

Here 是一个 dbfiddle。

【讨论】:

  • 谢谢,它几乎可以工作了。如果当我在该位置使用子查询或变量时,我必须从另一个查询中获取诸如“PIN,BALL”之类的关键字,则会向我抛出错误:java.sql.SQLException:ORA-12722:正则表达式内部错误。请帮忙。
  • 似乎 Replace 没有占用更多字符 .. 我有 24 个关键词,导致完整的文本超过 150 个字符,所以它不起作用。
  • @PrakashKavilapati 。 . .我添加了一个 dbfiddle。当我尝试它时它会起作用。
  • 我也试过..我添加了更多的关键字,如下所示,如果您在ROBOT之后添加另一个单词,它将无法运行,这意味着每个版本的Oracle都有字符限制,我的版本在 125 之后就不行了,dbfiddle.uk/…
  • @PrakashKavilapati 。 . .有限制,但字符串为 2000 字节。正则表达式限制为 512 个字节。
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多