我在搜索部分工作,在那里比较输入值和存储的记录。数据库,其值类似于AB 09 C D 1234。我已经分解(用空格)输入字符串以匹配存储的值,但是当我输入AB09 CD 1234时,它不会产生上述记录。
SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%AB09 CD 1234%'
车辆编号(单位:db):
AB 09 C D 1234
输入字符串:
AB09 CD 1234
我希望所有可能的场景都有输入字符串的组合。在PostgreSQL中有什么方法可以做到这一点吗?
“replace”函数可以消除字符串中的空格。在PostgreSQL中,有没有办法消除所有特殊字符以及空格。我尝试了不同的正则表达式,比如
regexp_replace(车辆编号,“[^a-z0-9\s],”)和
regexp|u replace(车辆|编号,“[(|-|)|:| \@|#| \$|*|。|!|\,]', '')
但它不起作用。
谢谢
几次尝试之后就想出来了!非常接近。”[^a-zA-Z0-9]“模式删除所有特殊字符,包括空格,其中‘g’选项是PostgreSQL中regexp_replace的第四个参数。”。
最佳答案
您可以这样做,从两个值中删除所有空格:
SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') =
replace(lower('AB09 CD 1234'), ' ', '');
或者,如果要保留子字符串匹配:
SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') LIKE
('%' || replace(lower('AB09 CD 1234'), ' ', '') || '%');
请注意,这将无法使用您当前在
vehicle_number
上拥有的任何索引,并将导致seq扫描(或者可能是索引扫描,如果您幸运的话),除非您创建专门的表达式索引来有效地处理此查询:CREATE INDEX ON some_vehicle (( replace(lower(vehicle_number), ' ', '') ));
(使用
LIKE
的子字符串查询将是unable to use any index,因为模式以%
开头)另一种选择是,如果
vehicle_number
值总是在完全相同的位置有空格,则不使用空格存储这些值,并在显示层(或视图中)中插入空格,因为您确切知道这些值的位置。然后您可以简单地从任何搜索值中去掉空格。