[英]Case statement not working as expected in Oracle
我在數據庫中有一個包含很多空/空行的字段。 我正在嘗試創建一個case語句,將其更改為“Empty Field”或類似的東西,以便在向用戶顯示時,它們將指示該行沒有該列的數據但由於某種原因它不是工作。 當我選擇沒有case語句的數據時,我會得到一個字符串或一個空字段。 當我添加case語句時,無論該列中的內容如何,每一行都返回{null}
。 我曾經多次使用類似的案例陳述,但這令我感到困惑。
SELECT CASE
WHEN col_name = TRIM('') THEN 'Empty Field'
END col_name
FROM table_name
我也試過LIKE
代替等號以及NULL
而不是TRIM('')
工作方案:
SELECT NVL(TRIM(col_name), 'Empty Field') AS col_name
FROM table_name
在Oracle中, ''
在VARCHAR上下文中被視為NULL
你可以使用NVL(col_name,'默認值')
select NVL(col_name, 'Empty Field') from table_name
Oracle SQL中的TRIM('')為NULL,因此無效。
SQL> set null NULL
SQL> select trim('') from dual;
T
-
N
U
L
L
就CASE語句而言,問題在於你使用NULL等於。 你不能說NULL =什么,它是假的。 NULL不等於任何東西,甚至不是自己。 你需要使用:
WHERE col_name IS NULL
IS NULL和= NULL不一樣。
SQL> select case when id = trim('') then 'Empty' end from nulls;
CASEW
-----
NULL
SQL> select case when id = null then 'Empty' end from nulls;
CASEW
-----
NULL
SQL> select case when id is null then 'Empty Field' end from nulls;
CASEW
-----
Empty Field <--- DATA!
如果這不起作用,也許您的數據中有空格。 測試通過使用SQLPLUS - SET NULL NULL命令我顯示驗證它是真正的NULL。
你應該使用nvl()
作為codenheim的建議,但是對於你原來的解決方案的答案,你沒有else
子句 - 所以沒有任何東西與= null
匹配而你永遠不會得到Empty field
,但是那些不匹配的東西然后是默認的無論如何要為空。 你需要這樣做:
SELECT CASE
WHEN col_name IS NULL THEN 'Empty Field'
ELSE col_name
END AS col_name
FROM table_name
但那將是一樣的
SELECT NVL(col_name, 'Empty Field') AS col_name
FROM table_name
你建議仍然沒有工作,但不是很具體; 但是你對trim
的原始使用讓我想知道你是否有一些非空值但只包含空格的值 - 所以它們之后仍然只是空格。 如果是這種情況,並且您希望將所有空格視為null,那么您可以執行以下操作:
SELECT NVL(TRIM(col_name), 'Empty Field') AS col_name
FROM table_name
如果你有其他空格 - 也許只是一個tab
- 那么你可以使用正則表達式去除它,例如:
SELECT NVL(REGEXP_REPLACE(col_name, '^[[:space:]]+$', NULL),
'Empty Field') AS col_name
FROM table_name;
SQl小提琴演示 。
正確的做法是使用codenheim示例。但是為了清楚起見,當您在oracle中檢查NULL列時,您必須使用IS NULL
SELECT CASE
WHEN col_name IS NULL THEN 'Empty Field'
ELSE col_name
END AS col_name
FROM table_name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.