PostgreSQL Reverse LIKE

hmae6n7t  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(133)

我需要测试列值的任何部分是否在给定的字符串中,而不是该字符串是否是列值的一部分。例如:
这样,我就可以找到表中是否有任何一行包含column中的字符串'bricks':

SELECT column FROM table
WHERE column ILIKE '%bricks%';

字符串
但我想找的是,“* 船挂在天空中的方式和砖头挂在天空中的方式差不多 *”这句话的任何一部分,是否在任何一行中。例如:

SELECT column FROM table
WHERE 'The ships hung in the sky in much the same way that bricks don’t' ILIKE '%' || column || '%';


因此,第一个示例中的行(其中列包含'bricks')将显示为结果。
我看了一些建议在这里和其他一些论坛,但他们都没有工作。

oknrviil

oknrviil1#

您的简单案例可以通过使用ANY结构和~*的简单查询来解决:

SELECT *
FROM   tbl
WHERE  col ~* ANY (string_to_array('The ships hung in the sky ... bricks don’t', ' '));

字符串
~*是大小写不敏感的正则表达式匹配运算符。我用它来代替ILIKE,这样我们就可以在字符串中使用原始单词,而不需要为ILIKE填充%。结果是相同的-除了包含特殊字符的单词:%_\用于ILIKE!$()*+.:<=>?[\]^{|}-用于正则表达式模式。您可能需要对特殊字符进行转义以避免意外。下面是一个正则表达式的函数:

  • 正则表达式或LIKE模式的转义函数

但我怀疑这就是你所需要的。看我的评论。我怀疑你需要全文搜索与匹配的字典为您的自然语言提供有用的词干…
相关内容:

ru9i0ody

ru9i0ody2#

此查询:

SELECT 
regexp_split_to_table(
  'The ships hung in the sky in much the same way that bricks don’t', 
  '\s' );

字符串
给出以下结果:

| regexp_split_to_table |
|-----------------------|
|                   The |
|                 ships |
|                  hung |
|                    in |
|                   the |
|                   sky |
|                    in |
|                  much |
|                   the |
|                  same |
|                   way |
|                  that |
|                bricks |
|                 don’t |


现在只需对该查询的结果执行半连接即可获得所需的结果

SELECT * FROM table t
WHERE EXISTS (
   SELECT * FROM (
      SELECT 
    regexp_split_to_table(
      'The ships hung in the sky in much the same way that bricks don’t', 
      '\s' ) x
   ) x
   WHERE t.column LIKE '%'|| x.x || '%'
)

相关问题