PostgreSQL 反向 LIKE
Posted
技术标签:
【中文标题】PostgreSQL 反向 LIKE【英文标题】:PostgreSQL Reverse LIKE 【发布时间】:2017-08-17 14:37:36 【问题描述】:我需要测试列值的任何部分是否在给定字符串中,而不是字符串是否是列值的一部分。 例如:
这样,我可以找到我的表中的任何行是否包含column
中的字符串'bricks':
SELECT column FROM table
WHERE column ILIKE '%bricks%';
但我正在寻找的是找出句子“The ships hang in the sky in much the same way that bricks don't”这句话的任何部分行。 比如:
SELECT column FROM table
WHERE 'The ships hung in the sky in much the same way that bricks don’t' ILIKE '%' || column || '%';
因此,第一个示例中包含“砖块”的行将作为结果显示。
我已经浏览了这里和其他一些论坛的一些建议,但都没有奏效。
【问题讨论】:
我觉得很好,here 是一个演示 @Lamak 我认为他们想将句子拆分成单独的单词并检查这些单词中的任何一个是否以任何顺序出现在表格列中。我认为我们需要将字符串拆分为行,然后简单地检查每个行是否存在 @xQbert 啊,你可能是对的。 @douglas_forsell 我会使用***.com/questions/29419993/… 将字符串拆分为行以开始,然后从那里开始。通过加入等。 你真的想匹配'bricks',而不是词干'brick'吗?你真的想考虑像“the”或“in”这样的干扰词吗?column
到底包含了什么?作为总是,首先提供您的 Postgres 版本和准确的表定义。
【参考方案1】:
您的简单案例可以通过使用ANY
构造和~*
的简单查询来解决:
SELECT *
FROM tbl
WHERE col ~* ANY (string_to_array('The ships hung in the sky ... bricks don’t', ' '));
~*
是不区分大小写的正则表达式匹配运算符。我使用它而不是ILIKE
,因此我们可以在您的字符串中使用原始单词,而无需为ILIKE
填充%
。结果是相同的 - 除了包含特殊字符的单词:%_\
用于 ILIKE
和 !$()*+.:<=>?[\]^|-
用于正则表达式模式。您可能需要以任何一种方式转义特殊字符以避免意外。这是一个正则表达式的函数:
但我有一些挥之不去的疑虑,这就是你所需要的。看我的评论。我怀疑您需要为您的自然语言提供匹配字典的全文搜索,以提供有用的词干...
相关:
IN vs ANY operator in PostgreSQL PostgreSQL LIKE query performance variations Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL【讨论】:
【参考方案2】:这个查询:
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 || '%'
)
【讨论】:
以上是关于PostgreSQL 反向 LIKE的主要内容,如果未能解决你的问题,请参考以下文章
PowerDesigner:反向 PostgreSQL SQLSTATE =22003和SQLSTATE = 42703