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!)