【问题标题】:how to check type of value in postgres如何检查postgres中的值类型
【发布时间】:2011-04-19 04:12:11
【问题描述】:

我想像这样检查 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

【问题讨论】:

  • 对于要返回列值的 CASE 语句中的所有结果,数据类型必须相同。但目前尚不清楚您正在测试什么列,或者它是数据类型...否则您正在查看检查系统表的列数据类型和动态 SQL...
  • PostgreSQL 文档有关于数据类型优先级的内容吗?

标签: sql postgresql


【解决方案1】:

如果其他人想知道如何获取变量的数据类型不是列),您可以使用pg_typeof(any) 函数。

简单

SELECT pg_typeof(your_variable);

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

注意

pg_typeof(varchar_column) 将返回不同的字符,而不管 列的内容。任何列或变量都已键入并且 pg_typeof 将返回声明的类型。它不会找到“最好的 Fitting" 类型取决于该列(或变量)的值。-- 引用 a_horse_with_no_name 的评论。

【讨论】:

  • pg_typeof(varchar_column) 将返回character varying,无论该列的内容如何。任何列或变量都已键入,pg_typeof 将返回该声明的类型。它不会根据该列(或变量)的值找到“最佳拟合”类型。
  • @a_horse_with_no_name 谢谢,我不知道,我来这里是为了寻找“如何获取变量数据类型”,所以我想我应该分享一个对我有帮助的方法。让我更新一下你刚刚分享的信息。
  • 我最初赞成答案,但后来意识到它对我不起作用,因此被否决(因为返回只是空白......)。 @a_horse_with_no_name 在别处的回答对我有用(我赞成)。仍然是管理员...为什么我失去了一分?
  • @Kajsa:对不起,它是由马编辑的。但答案是 selva:stackoverflow.com/questions/20194806/…。具体来说,selva 的回答帮助我想出了这个:“SELECT data_type FROM information_schema.columns WHERE table_name = '{0}' AND column_name = '{1}'”
  • @ArchNoob,道歉并不是要贬低你。我只是想拿走我的赞成票。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2013-12-25
    • 2020-07-02
    • 2022-07-08
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多