在PostgreSQL查询中部分匹配整数

时间:2018-08-20 14:48:22

标签: regex postgresql integer

因此在PostgreSQL 10中,我有一列类型为integer的列。此列代表产品的代码,应对照其他代码或部分代码进行搜索。该列的值由三部分组成,一个五位数部分和两个两位数部分。用户只能搜索第一部分,第一秒或第一分之二。

因此,在我的专栏中,说123451233,用户搜索12345(第一部分)。我希望能够返回123451233。如果用户还搜索1234512123451233,也是如此。

不幸的是,我无法更改列的类型或将一列分成三列(每个部分一列)。我怎样才能做到这一点?我不能使用LIKE。也许像正则表达式的整数?

谢谢

3 个答案:

答案 0 :(得分:1)

\b(123)[0-9]+\b

Above正则表达式将从字符串的开头开始匹配。

您所要做的就是将搜索词放在方括号中

示例:regexr.com/3u6ii

因此\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的最佳案例。