2017-08-17 301 views
0

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

这样一来,我可以找到,如果在我的表中的任何行包含column字符串“砖头”:

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

所以从第一个例子,其中列中含有“砖头”,该行将显示为结果。

我已经看过这里和其他一些论坛的一些建议,但没有一个工作。

+0

似乎罚款给我,[这里](http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=6889c69d6d61fb8424c53e25206bb60a)是一个演示 – Lamak

+0

@Lamak我t他们希望将句子拆分为单独的单词,并检查这些单词是否以任何顺序出现在表格列中。我想我们需要将字符串拆分成行,然后检查每个字符串是否存在 – xQbert

+0

@xQbert啊,你可能是对的。 – Lamak

回答

3

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

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

~*是不区分大小写的正则表达式匹配操作。我用这个来代替ILIKE,所以我们可以在你的字符串中使用原始单词,并且不需要为ILIKE填充%。结果是相同的 - 除了包含特殊字符的文字:%_\ILIKE!$()*+.:<=>?[\]^{|}-)用于正则表达式模式。您可能需要避开特殊字符以避免意外。下面是正则表达式的功能:

但我唠叨怀疑,这将是你所需要的。看到我的评论。我怀疑你需要全文与匹配字典搜索你的自然语言提供有用的单词词根...

相关:

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