sql - CASE 语句内的数据类型转换

标签 sql informix

我正在使用 Informix,并且在查询中有一个 CASE 语句,如下所示:

CASE 
 when l.src_country = 'USA' then tl.cat--prodUSA.description
 when l.src_country = 'CAN' AND tl.fuel_type > 0 then tl.fuel_type
 when l.src_country = 'CAN' and tl.fuel_type = 0 and tl.cat in ("DEF","DEFD") then 4194304
 when l.src_country = 'CAN' and tl.fuel_type = 0 and tl.cat not in ("DEF","DEFD") then tl.fuel_type
 else 0
 END as product_code

在上面的语句中,“tl.cat”是CHAR类型,“tl.fuel_type”是INT类型。

我需要做这样的事情:

CASE 
 when l.src_country = 'USA' then tl.cat--prodUSA.description
 when l.src_country = 'CAN' AND tl.fuel_type > 0 then tl.fuel_type :: CHARACTER
 when l.src_country = 'CAN' and tl.fuel_type = 0 and tl.cat in ("DEF","DEFD") then 4194304
 when l.src_country = 'CAN' and tl.fuel_type = 0 and tl.cat not in ("DEF","DEFD") then tl.fuel_type :: CHARACTER
 else 0
 END as product_code

但是当我尝试时,我收到以下错误:

Corresponding data types must be compatible in CASE expression or DECODE function. [SQL State=IX000, DB Errorcode=-800]

当我尝试这个时:

CASE
when l.src_country = 'USA' then tl.cat--prodUSA.description
when l.src_country = 'CAN' AND tl.fuel_type > 0 then tl.fuel_type :: CHAR
when l.src_country = 'CAN' and tl.fuel_type = 0 and tl.cat in ("DEF","DEFD") then '4194304'
when l.src_country = 'CAN' and tl.fuel_type = 0 and tl.cat not in ("DEF","DEFD") then tl.fuel_type :: CHAR
else '0'
END as product_code

我收到以下错误:

Converted value does not fit into the allotted space 

我需要将 tl.fuel_type 转换为角色。我在这里做错了什么?

最佳答案

假设我们有一个像这样的表设置:

DROP TABLE IF EXISTS fuel_info;
CREATE TEMP TABLE fuel_info
(
    src_country    CHAR(3) NOT NULL,
    fuel_type      INTEGER NOT NULL,
    cat            CHAR(9) NOT NULL
);

INSERT INTO fuel_info VALUES('USA', 12, 'CAT1');
INSERT INTO fuel_info VALUES('CAN', 10, 'ABC2');
INSERT INTO fuel_info VALUES('CAN',  0, 'DEFD');
INSERT INTO fuel_info VALUES('CAN',  0, 'WXYZ');
INSERT INTO fuel_info VALUES('EUR',  1, 'P3X9');

我们可以调整问题中的表达式来重现问题。例如:

SELECT 
    CASE
    WHEN tl.src_country = 'USA' THEN tl.cat--prodUSA.description
    WHEN tl.src_country = 'CAN' AND tl.fuel_type > 0 THEN tl.fuel_type::CHAR
    WHEN tl.src_country = 'CAN' AND tl.fuel_type = 0 AND tl.cat IN ("DEF","DEFD") THEN '4194304'
    WHEN tl.src_country = 'CAN' AND tl.fuel_type = 0 AND tl.cat NOT IN ("DEF","DEFD") THEN tl.fuel_type::CHAR
    ELSE '0'
    END AS product_code
  FROM fuel_info AS tl;

这会生成SQL -1207:转换后的值不适合分配的空间错误。

您可以通过为 CHAR 类型转换指定足够大的长度来修复此问题:

SELECT 
    CASE
    WHEN tl.src_country = 'USA' THEN tl.cat--prodUSA.description
    WHEN tl.src_country = 'CAN' AND tl.fuel_type > 0 THEN tl.fuel_type::CHAR(7)
    WHEN tl.src_country = 'CAN' AND tl.fuel_type = 0 AND tl.cat IN ("DEF","DEFD") THEN '4194304'
    WHEN tl.src_country = 'CAN' AND tl.fuel_type = 0 AND tl.cat NOT IN ("DEF","DEFD") THEN tl.fuel_type::CHAR(7)
    ELSE '0'
    END AS product_code
  FROM fuel_info AS tl;

这有效,产生:

CAT1
10
4194304
0
0

关于sql - CASE 语句内的数据类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44118401/

相关文章:

sql - 用标识列重新插入行

sql - 如何在 SELECT INTO 中控制基于文字的列的可空性

sql - 如何列出 Informix 中的所有函数?

c# - Informix 内存泄漏

sql - 如何将 IN 运算符与 LIKE 条件结合起来(或获得可比较结果的最佳方法)

sql - 两个查询之间的减法

java - MS Access "invalid record set status"错误

java - 关于 Hibernate 和 Informix 的问题

php - 快照启动后 : Informix Client -23101/Oracle instant client -28759

java - Informix 密码即将过期异常