【发布时间】:2019-09-01 11:23:46
【问题描述】:
Manufacturer
==========================
id name
--------------------------
1 Company Inc.
2 Google Test.
3 3M (UNITY) USA. INC.
4 CE EE
说,我有一个字符串 'Google Test. 1257 SCS RANDOM 31233DD' 我想查找表manufacturer 中的所有行,其中ht name 是给定字符串的一部分:
SELECT * FROM manufacturer
WHERE 'Google Test. 1257 SCS RANDOM 31233DD' ILIKE '%' || name || '%'
正确返回:
id name
--------------------------
2 Google Test.
但是当我这样做时:
SELECT * FROM manufacturer
WHERE '3dad QTICE EEN ' ILIKE '%' || name || '%'
它返回:
id name
--------------------------
4 CE EE
我不想要这样的部分匹配。 name 不能在单词中间匹配。我试过substring():
SELECT * from manufacturer
WHERE SUBSTRING('Google Test. 1257 SCS RANDOM 31233DD' from name) != '';
但我明白了:
ERROR: invalid regular expression: quantifier operand invalid
不幸的是,我没有确切的规范,因为我正在从外部数据库查询这个。但据我所见,专栏是varchar(256)。所有值都大写并使用纯空格。全部以字符或数字开头,以数字、字符或特殊字符结尾。例如:'CLEVLAND DRILL (GREEN)'。值中有特殊字符,如,.()&/
我并不是真的在寻找效率,只要执行一次查询不超过 50 毫秒。
截至目前,大约有 10000 多个条目,但它可能会随着时间的推移而增长。
【问题讨论】:
-
要得到准确的答案,您必须给出“单词”的准确定义。单词总是用纯空格分隔吗?开始/结束呢?短跑?其他标点符号?区分大小写?数字?词干?然后:桌子很大,性能重要吗?然后提供您的 Postgres 版本、表定义、avg。字符串长度,基数。
-
@ErwinBrandstetter 嗨,对不起。根据我的观察,我尽可能地添加了规范。
标签: sql regex postgresql pattern-matching