如何计算 Postgres 整数数据类型的位数?

Posted

技术标签:

【中文标题】如何计算 Postgres 整数数据类型的位数?【英文标题】:How to count number of digits in Postgres integer data type? 【发布时间】:2015-08-12 07:50:53 【问题描述】:

我需要在 postgres 中将“整数”类型字段中的位数限制为 6 或 7。

基本上它应该接受 123456 或 1234567,但它不应该接受 12345 或 12345678。 我怎样才能做到这一点??

【问题讨论】:

检查 100000 到 9999999 之间的 abs(value)? 【参考方案1】:

您可以使用floor(log(i)+1 获取数字中的位数(即base10 日志)。

DB> CREATE TEMP TABLE t (
      i integer CONSTRAINT i_has_6_or_7_digits CHECK (floor(log(abs(i))+1) BETWEEN 6 AND 7)
    );
CREATE TABLE
Time: 5,676 ms

DB> INSERT INTO t VALUES (123456), (1234567);
INSERT 0 2
Time: 0,471 ms

DB> INSERT INTO t VALUES (12345);
ERROR:  23514: new row for relation "t" violates check constraint "i_has_6_or_7_digits"
DETAIL:  Failing row contains (12345).
SCHEMA NAME:  pg_temp_2
TABLE NAME:  t
CONSTRAINT NAME:  i_has_6_or_7_digits
LOCATION:  ExecConstraints, execMain.c:1661
Time: 0,468 ms

DB> INSERT INTO t VALUES (12345678);
ERROR:  23514: new row for relation "t" violates check constraint "i_has_6_or_7_digits"
DETAIL:  Failing row contains (12345678).
SCHEMA NAME:  pg_temp_2
TABLE NAME:  t
CONSTRAINT NAME:  i_has_6_or_7_digits
LOCATION:  ExecConstraints, execMain.c:1661
Time: 0,215 ms

【讨论】:

感谢 Madhivanan 和 Marth!这两种解决方案都很好,但哪一种更快?【参考方案2】:

有一个检查约束

check (value>99999 and value<=9999999)

【讨论】:

以上是关于如何计算 Postgres 整数数据类型的位数?的主要内容,如果未能解决你的问题,请参考以下文章

大整数加法计算

如何计算 3D Morton 数(交错 3 个整数的位)

java 自定义一个整数,计算它是几位数?

Postgres 中数字数据类型的精度和小数位数是多少?

java两个数相除后保留两位小数 (四舍五入),并且结果大于三位数要有千位分隔符,不是整数时,小数点前三

pascal 由键盘上输入任意n个一位数数输出它的全排列