如何检查postgres中的值类型

de_*_*e_3 42 sql postgresql

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

SELECT id,
       CASE 
         WHEN val_is_integer THEN (SOME_QUERY)
         WHEN val_isnot_integer THEN (ANOTHER_QUERY)
         ELSE 0
       END
  FROM test;
Run Code Online (Sandbox Code Playgroud)

怎么做?


注意:表中的值是varchar类型,在该字段中有值是numeric和varchar ...

例:

ID | value
1 | test
2 | 10
3 | 12
4 | test123
Run Code Online (Sandbox Code Playgroud)

Arc*_*oob 44

如果有人想知道如何获取变量(不是列)的数据类型,则可以使用该pg_typeof(any)函数.

只是

SELECT pg_typeof(your_variable);
Run Code Online (Sandbox Code Playgroud)

要么

SELECT pg_typeof('{}'::text[]); //returns text[];
Run Code Online (Sandbox Code Playgroud)

注意

无论列的内容如何,​​pg_typeof(varchar_column)都将返回不同的字符.已经键入任何列或变量,pg_typeof将返回该声明的类型.根据该列(或变量)的值,它将找不到"最佳拟合"类型.- 引用a_horse_with_no_name的评论.

  • 无论列的内容如何,​​`pg_typeof(varchar_column)` 都将返回`字符变化`。任何列或变量都已经被输入,`pg_typeof` 将返回那个声明的类型。它不会根据该列(或变量)的值找到“最佳拟合”类型。 (4认同)
  • @Kajsa:抱歉,它是由 horse 编辑的..但答案是由 selva 提供的:/sf/ask/1413636451/ -postgresql 中的表/32369441#32369441。具体来说,塞尔瓦的回答帮助我想出了这个:“SELECT data_type FROM information_schema.columns WHERE table_name = '{0}' AND column_name = '{1}'” (2认同)

nos*_*nos 6

您的值列始终是varchar类型,您似乎要检查内容是否为数字/整数.

你可以通过创建一个函数来做到这一点,例如

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

(该函数可能通过尝试将文本转换为int,或使用int4()函数并捕获发生的错误,并返回NULL来实现.)

有了这样的功能,你可以做到:

SELECT id,
       CASE 
         WHEN value IS NULL THEN 0
         WHEN isdigits(value) THEN (SOME_QUERY)
         ELSE (ANOTHER_QUERY)
       END
  FROM test;
Run Code Online (Sandbox Code Playgroud)