postgresql 如何在postgres中检查值类型

drnojrws  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(3)|浏览(351)

我想检查postgres中的值类型,如下所示:

SELECT id,
       CASE 
         WHEN val_is_integer THEN (SOME_QUERY)
         WHEN val_isnot_integer THEN (ANOTHER_QUERY)
         ELSE 0
       END
  FROM test;

如何做到这一点?
注意:该值是varchar类型在表中,并在该字段中有值是数字和varchar ...
例如:

ID | value
1 | test
2 | 10
3 | 12
4 | test123
erhoui1w

erhoui1w1#

如果有人想知道如何获取变量的数据类型(* 不是列 *),你可以使用pg_typeof(any)函数。
简单

SELECT pg_typeof(your_variable);

SELECT pg_typeof('{}'::text[]); //returns text[];

备注

pg_typeof(varchar_column)将返回字符变化,与列的内容无关。任何列或变量都已经被类型化,pg_typeof将返回声明的类型。它不会根据该列(或变量)的值找到“最佳拟合”类型。-- * 引用a_horse_with_no_name的评论。*

jm81lzqq

jm81lzqq2#

你的值列总是varchar类型,似乎你想检查内容是否是数字/整数。
你可以通过创建一个函数来实现,例如

create function isdigits(text) returns boolean as '
select $1 ~ ''^(-)?[0-9]+$'' as result
' language sql;

(That可以通过尝试将文本转换为int来实现函数,或者使用int 4()函数并捕获发生的错误并返回NULL。
有了这样的函数,你可以做:

SELECT id,
       CASE 
         WHEN value IS NULL THEN 0
         WHEN isdigits(value) THEN (SOME_QUERY)
         ELSE (ANOTHER_QUERY)
       END
  FROM test;
dldeef67

dldeef673#

对于postgres DB,您可以使用以下查询获取所有类型及其枚举值-

SELECT t.typname AS enum_name,e.enumlabel AS enum_value
FROM pg_type t
JOIN pg_enum e ON t.oid = e.enumtypid
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
WHERE t.typtype = 'e'
ORDER BY enum_name;

相关问题