因此在PostgreSQL 10中,我有一列类型为integer
的列。此列代表产品的代码,应对照其他代码或部分代码进行搜索。该列的值由三部分组成,一个五位数部分和两个两位数部分。用户只能搜索第一部分,第一秒或第一分之二。
因此,在我的专栏中,说123451233
,用户搜索12345
(第一部分)。我希望能够返回123451233
。如果用户还搜索1234512
或123451233
,也是如此。
不幸的是,我无法更改列的类型或将一列分成三列(每个部分一列)。我怎样才能做到这一点?我不能使用LIKE
。也许像正则表达式的整数?
谢谢
答案 0 :(得分:1)
\b(123)[0-9]+\b
Above正则表达式将从字符串的开头开始匹配。
您所要做的就是将搜索词放在方括号中
因此\b(123)[0-9]+\b
将与以下全部匹配:
-> 1234567
1245621
193602
但是\b(12)[0-9]+\b
将同时匹配第一个和第二个
答案 1 :(得分:1)
您不需要正则表达式功能。将整数强制转换为#!/usr/bin/env bash
source=/proc/sys/kernel/random/uuid
while IFS= read -r line; do
printf '%s\n' "${line//uuidVariable/$(<"$source")}"
done < input > output
并使用函数left()
,例如:
text
答案 2 :(得分:1)
考虑使用简单的算术。
log(value)::int + 1
返回value
的整数部分的位数,并使用此数字:
value/(10^(log(value)::int-log(search_input)::int))::int
返回value
,将其截断为与search_input
相同的数字,因此,最后
search_input = value/(10^(log(value)::int-log(search_input)::int))::int
会成功的
从字面上讲,它比较复杂,但是比字符串操作可能更有效。
PS:但是具有像create index idx on your_table(cast(your_column as text));
这样的索引
select * from your_table
where cast(your_column as text) like search_input || '%';
是IMO的最佳案例。