如何使用postgres中的where条件获取包含数字和字符串的表结果

时间:2019-07-11 08:45:05

标签: postgresql postgresql-9.5

我有一个如下表

enter image description here

当我从上表中选择item_no>'1623G'

我想在下面打印结果

1623H | 1623I | 1666 | 1674 | 1912 | 1952 | 1953

我正在尝试使用命令

select * from t where substring(item_no,'([0-9]+)') :: int  > 1623G

但是没有给出结果 请帮助

2 个答案:

答案 0 :(得分:1)

您可以将 CONVERT_TO 用作:

testdb1=# CREATE TABLE t (item_no varchar(20));
CREATE TABLE
testdb1=# INSERT INTO t VALUES('2'),('20'),('200'),('200a'),('200b'),('200c'),('2000');
INSERT 0 7
testdb1=# SELECT * FROM t;
 item_no 
---------
 2
 20
 200
 200a
 200b
 200c
 2000
(7 rows)

testdb1=# select * from t where substring(convert_to(item_no,'SQL_ASCII')::text,3)::int > substring(convert_to('2a','SQL_ASCII')::text,3)::int;
 item_no 
---------
 200
 200a
 200b
 200c
 2000
(5 rows)

testdb1=# select * from t where substring(convert_to(item_no,'SQL_ASCII')::text,3)::int > substring(convert_to('150','SQL_ASCII')::text,3)::int;
 item_no 
---------
 200
 200a
 200b
 200c
 2000
(5 rows)

答案 1 :(得分:1)

我会使用正则表达式:

demo:db<>fiddle

WITH cte AS (
    SELECT
        item_no,
        regexp_replace(item_no, '\D', '', 'g')::int AS digit,
        regexp_replace(item_no, '\d', '', 'g') AS nondigit,
        regexp_replace('200a', '\D', '', 'g')::int AS compare_digit,
        regexp_replace('200a', '\d', '', 'g') AS compare_nondigit
    FROM t
)
SELECT
    item_no
FROM
    cte
WHERE
    (digit > compare_digit) OR (digit = compare_digit AND nondigit > compare_nondigit)

将两个值(行值和比较值)都分为两个部分(数字和非数字),然后分别比较每个部分。

我很好奇是否有更好的解决方案。