簡體   English   中英

CASE語句中的數據類型轉換

[英]Data type casting inside a CASE statement

我正在使用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為Character。 我在這里做錯了什么?

假設我們有一個這樣的單表設置:

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: Converted value does not fit into the allotted space錯誤。

您可以通過為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM