【问题标题】:ERROR: CASE types character varying and numeric cannot be matched错误:CASE 类型字符不同且数字无法匹配
【发布时间】:2017-11-03 04:47:39
【问题描述】:

我正在 Postgres 中编写一个 select 语句,其中包含 case 语句如下:

,(case when all_loc.country = 'DE' then msc_si.buyer_id else msc_si.buyer_name end) as "purchasing_group_name_buyer_name"  --story
,(case when all_loc.country = 'DE' then msc_si.planner_code else mscp.description end) as "mrp_controller_name"                --story

我收到以下错误。我尝试使用IS 而不是=,但没有奏效。如果没有这两个 case 语句,查询将完美运行。

错误:CASE 类型的字符变化和数字不能匹配 SQL 状态:42804

【问题讨论】:

  • @a_horse_with_no_name,我觉得不是比较问题,我觉得是类型输出问题。也就是说,我假设msc_si.buyer_name是一个字符串,msc_si.buyer_id是一个数字。

标签: sql postgresql select case


【解决方案1】:

case 表达式的所有分支都应返回相同的数据类型。实现这一目标的一种方法是在需要的地方显式转换:

,(case when all_loc.country = 'DE' then msc_si.buyer_id::varchar else msc_si.buyer_name end) as "purchasing_group_name_buyer_name"
-- Here -----------------------------------------------^
,(case when all_loc.country = 'DE' then msc_si.planner_code::varchar else mscp.description end) as "mrp_controller_name"
-- And here -----------------------------------------------^

【讨论】:

  • char 实际上是char(1),它将截断大部分数字id,例如1234::char'1'。 OP 应该使用 ::text::varchar 强制转换。
  • @pozs 不错,谢谢!我已经相应地编辑了我的答案。
【解决方案2】:
SELECT "table","schema",
CASE 
WHEN  "size" <= 1024 Then SIZE::varchar || 'MB'
WHEN  "size" > 1024 AND "size"  < 1000000 Then ("SIZE"/1024)::varchar || 'GB'
WHEN  "size" > 1000000 THEN ("SIZE"/1024)/1024::varchar || 'TB'
END size
FROM SVV_TABLE_INFO 
order by 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多