错误:CASE类型字符变化,数字无法匹配

Abh*_*jit 12 sql postgresql select case

我在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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误.我试过IS而不是=,没有工作.没有这两个case语句,查询运行完美.

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

Mur*_*nik 20

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 gere -----------------------------------------------^
Run Code Online (Sandbox Code Playgroud)

  • `char`实际上是`char(1)`,它会截断大多数数字id,比如`1234 :: char`就是''1'.OP应该使用`:: text`或`:: varchar` casts. (2认同)

小智 5

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;
Run Code Online (Sandbox Code Playgroud)