我想从数据库中查询可能以替换列表中的任何单词开头的行。例如,查询名称blue tree house
将返回诸如the blue tree house
或le blue tree house
或A 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以及其他示例和设置。
答案 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次(就像您遇到过,示例不需要)