是否可以在BIGINT
不进行硬编码的情况下获取类型的最大值?
我知道该限制是众所周知的,但是我不想对其进行硬编码。
您可以使用pg_column_size
,它将为您提供bigint的字节大小。使用它可以获得最大和最小尺寸:
select (2^(8*pg_column_size(1::bigint)-2))::bigint << 1 as min_bigint_value;
select -(((2^(8*pg_column_size(1::bigint)-2))::bigint << 1)+1) as max_bigint_value;
因此,如果将来bigint最大值以某种方式改变(非常非常不可能),那么如果您依靠这些计算出的值,您的代码仍然可以工作。
您可以编写函数以方便使用:
CREATE OR REPLACE FUNCTION "get_max_bigint_value"() RETURNS BIGINT as $$
DECLARE
max_bigint_value BIGINT;
BEGIN
SELECT -(((2^(8*pg_column_size(1::BIGINT)-2))::BIGINT << 1)+1) INTO max_bigint_value;
RETURN max_bigint_value;
END
$$ LANGUAGE "plpgsql";
CREATE OR REPLACE FUNCTION "get_min_bigint_value"() RETURNS BIGINT as $$
DECLARE
min_bigint_value BIGINT;
BEGIN
SELECT (2^(8*pg_column_size(1::bigint)-2))::bigint << 1 INTO min_bigint_value;
RETURN min_bigint_value;
END
$$ LANGUAGE "plpgsql";
接着:
SELECT get_min_bigint_value();
SELECT get_max_bigint_value();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句