我需要测试列值的任何部分是否在给定字符串中,而不是字符串是否是列值的一部分。 例如:
这样,我可以找到我的表中的任何行是否包含android:centerX
中的字符串'blocks':
column
但我正在寻找的,就是要找出句子中的任何一部分“天空中挂着的船只与砖块没有”的任何一种行。 类似的东西:
SELECT column FROM table
WHERE column ILIKE '%bricks%';
因此,第一个示例中的行(其中包含“砖块”)将显示为结果。
我在这里和其他一些论坛上看了一些建议,但没有一个有效。
答案 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 || '%'
)