在开头搜索其他单词

时间:2020-07-07 23:40:35

标签: sql regex postgresql

我想从数据库中查询可能以替换列表中的任何单词开头的行。例如,查询名称blue tree house将返回诸如the blue tree housele blue tree houseA blue tree house之类的记录。

我尝试查询如下:

SELECT NAME
FROM NAMES
WHERE (lower(names.name) ~ '^(no.?)*\s*\d*\s*\W*(an|the|le|leur|ils|a)?(blue)\W*\s*\y') AND
      (lower(names.name) ~ ' \yhouse ?\y')

Here the Fiddle以及其他示例和设置。

1 个答案:

答案 0 :(得分:0)

由于字符串的结尾是常量,所以建议您反向搜索,这样可以有效地使用匹配索引:

CREATE INDEX ON names (lower(reverse(name)));

您可能想禁止name中的尾随(和前导)空格。

然后:

SELECT name
FROM   names
WHERE  lower(reverse(name)) LIKE lower(reverse('BLUE HOUSE')) || '%' -- backed by index
AND    name ~* '^((?:no\.?\s*)?\d*\y| a|an|the|le|leur|ils|a)\y';  -- filter the few remaining rows

db <>提琴here

您的“替代清单”是否完整?我添加了一个表达式来覆盖您提供的所有示例。

值得注意:(?:no\.?\s*)?

(?:) ... capturing parentheses
\. ...文字点需要转义反斜杠
? ... 0或1次(就像您遇到过,示例不需要)