1. 程式人生 > 實用技巧 >CAST & CASE WHEN

CAST & CASE WHEN

1. 利用 CAST 可以修改資料的型別,下面示例中,原本SQL返回的資料型別為decimal,被修改成為整數型;

2. 利用Case when 語句,實現pivot 功能,下面SQL語句實現的搜尋結果為下圖

SELECT 
    DATE_FORMAT(uniic_db.app_miniline_yield_miniline_yield.Date_Test,
            '%Y%m') AS months,
    CAST(SUM(CASE WHEN (Board_Type = 'D2 U/SO-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE
0 END) AS SIGNED) AS 'D2 U/SO-DIMM', CAST(SUM(CASE WHEN (Board_Type = 'D3 U/SO-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS 'D3 U/SO-DIMM', CAST(SUM(CASE WHEN (Board_Type = 'D4 U/SO-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS 'D4 U/SO-DIMM',
CAST(SUM(CASE WHEN (Board_Type = 'D3 R-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS 'D3 R-DIMM', CAST(SUM(CASE WHEN ((Board_Type='D4 R-DIMM(Z10PE)' or Board_Type= 'D4 R-DIMM(Z11PA)' or Board_Type= 'D4 R-DIMM') AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS
'D4 R-DIMM', CAST(SUM(CASE WHEN PO_Type <>'F' THEN QTY_Test else 0 end) as signed ) AS 'test_qty', CAST(SUM(CASE WHEN PO_Type <>'xxxxx' THEN QTY_Test else 0 end) as signed ) AS 'NO_test_qty' FROM uniic_db.app_miniline_yield_miniline_yield GROUP BY months order by months ;

搜尋結果:

CAST函式:

CAST函式用於將某種資料型別的表示式顯式轉換為另一種資料型別。CAST()函式的引數是一個表示式,它包括用AS關鍵字分隔的源值和目標資料型別。

語法:CAST (expression AS data_type)

expression:任何有效的SQServer表示式。
AS:用於分隔兩個引數,在AS之前的是要處理的資料,在AS之後是要轉換的資料型別。
data_type:目標系統所提供的資料型別,包括bigint和sql_variant,不能使用使用者定義的資料型別。

可以轉換的型別是有限制的。這個型別可以是以下值其中的一個:

    • 二進位制,同帶binary字首的效果 : BINARY
    • 字元型,可帶引數 : CHAR()
    • 日期 : DATE
    • 時間: TIME
    • 日期時間型 : DATETIME
    • 浮點數 : DECIMAL
    • 整數 : SIGNED
    • 無符號整數 : UNSIGNED

例子:

1.SELECT CAST('109.024' AS decimal) 結果:109

2.SELECT CAST('24356349.5535772' AS decimal(30,3)) 結果:'24356349.554' (精度與小數位數分別為30與3。精度是總的數字位數,包括小數點左邊和右邊位數的總和。而小數位數是小數點右邊的位數)

3.SELECT CAST(NOW() AS DATE)結果:'2020-07-30' 原本NOW() 是DATETIME 型別,被更改為DATE型別;

Case 函式

case具有兩種格式。簡單case函式和case搜尋函式。

-- 簡單 Case 函式
case sex
when '1' then ''
when '2' then ''
else '其他' end

--case 搜尋函式
case when sex = '1' then ''
when sex = '2' then ''
 else '其他' end

這兩種方式,可以實現相同的功能。簡單case函式的寫法相對比較簡潔,但是和case搜尋函式相比,功能方面會有些限制,比如寫判定式。
還有一個需要注重的問題,case函式只返回第一個符合條件的值,剩下的case部分將會被自動忽略。

--比如說,下面這段sql,你永遠無法得到“第二類”這個結果

case when col_1 in ( 'a', 'b') then'第一類'
when col_1 in ('a')       then '第二類'
else'其他'end

下面我們來看一下,使用case函式都能做些什麼事情。

一,已知資料按照另外一種方式進行分組,分析。
有如下資料:

國家(country)

人口(population)

中國

600

美國

100

加拿大

100

英國

200

法國

300

日本

250

德國

200

墨西哥

50

印度

250