PostgreSQL:如何选择表中小数点后只有两位数的值?

PostgreSQL:如何选择表中小数点后只有两位数的值?,sql,regex,postgresql,postgresql-9.2,Sql,Regex,Postgresql,Postgresql 9.2,我有一个名为nums的表 CREATE TABLE nums (num numeric); INSERT INTO nums SELECT * FROM (VALUES(10.11),(11.122),(12.22),(13.555)) t; 它有以下行 select * from nums num -------- 10.11 11.122 12.22 13.555 所以我的问题是如何得到小数点后只有两位数的值() 预期产量:- num -------- 10

我有一个名为
nums
的表

CREATE TABLE nums (num numeric);
INSERT INTO  nums SELECT * FROM (VALUES(10.11),(11.122),(12.22),(13.555)) t;
它有以下行

select * from nums

num
--------
10.11
11.122
12.22
13.555
所以我的问题是如何得到小数点后只有两位数的值(


预期产量:-

    num
    --------
    10.11
    12.22
你可以试试

简单地说:

或与:

或者将数字转换为
文本

SELECT * FROM nums WHERE length((num%1)::text) = 4
最后一个独立于用于逗号的字符

旁白:您可以简化INSERT语句:

INSERT INTO nums VALUES(10.11),(11.122),(12.22),(13.555);

演出 我使用一个包含100k个数字的临时表进行了快速测试:

SELECT * FROM nums WHERE  ...

left(right(num::text, 3), 1) = '.';        -- Total runtime: 136 ms
length(split_part(num::text, '.', 2)) = 2; -- Total runtime: 162 ms
length((num%1)::text) = 4;                 -- Total runtime: 179 ms
num::text ~ '(^\d+(\.\d{1,2})?$)';         -- Total runtime: 280 ms (incorrect!)
FLOOR (num*100)=num*100;                   -- Total runtime: 203 ms (incorrect!)

最后两个(由@varchar提供)实际上是不正确的。请参阅注释和提琴。

[0-9]+\[0-9][0-9]
应该这样做,您必须使用单词边界或锚定。@Dan Allen用数学函数给出了答案。为什么在那之后又加上了同样的答案?我不建议在这种情况下使用正则表达式case@vuwe:为什么这个答案被接受?两个查询都不正确,将返回
0
111.1
SELECT * FROM nums WHERE length(split_part(num::text, '.', 2)) = 2;
SELECT * FROM nums WHERE length((num%1)::text) = 4
INSERT INTO nums VALUES(10.11),(11.122),(12.22),(13.555);
SELECT * FROM nums WHERE  ...

left(right(num::text, 3), 1) = '.';        -- Total runtime: 136 ms
length(split_part(num::text, '.', 2)) = 2; -- Total runtime: 162 ms
length((num%1)::text) = 4;                 -- Total runtime: 179 ms
num::text ~ '(^\d+(\.\d{1,2})?$)';         -- Total runtime: 280 ms (incorrect!)
FLOOR (num*100)=num*100;                   -- Total runtime: 203 ms (incorrect!)