PostgreSQL反向LIKE

时间:2017-08-17 14:37:37

标签: sql postgresql pattern-matching sql-like

我需要测试列值的任何部分是否在给定字符串中,而不是字符串是否是列值的一部分。 例如:

这样,我可以找到我的表中的任何行是否包含android:centerX中的字符串'blocks':

column

但我正在寻找的,就是要找出句子中的任何一部分“天空中挂着的船只与砖块没有”的任何一种行。 类似的东西:

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

因此,第一个示例中的行(其中包含“砖块”)将显示为结果。

我在这里和其他一些论坛上看了一些建议,但没有一个有效。

2 个答案:

答案 0 :(得分:3)

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

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

~*是不区分大小写的正则表达式匹配运算符。我使用它代替ILIKE,因此我们可以在字符串中使用原始字词,而无需为%填充ILIKE。结果相同 - 除了包含特殊字符的单词:%_\ ILIKE!$()*+.:<=>?[\]^{|}-正则表达式模式。您可能需要以任何方式逃避特殊字符以避免意外。这是正则表达式的函数:

但是我怀疑这将是你所需要的。看我的评论。我怀疑你需要使用匹配的字典进行全文搜索以获得自然语言,以提供有用的词干...

相关:

答案 1 :(得分:1)

此查询:

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 || '%'
)