簡體   English   中英

案例陳述在Oracle中沒有按預期工作

[英]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.

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