我在数据库中有一个包含大量空/空行的字段。我正在尝试创建一个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
答案 0 :(得分:5)
在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。
答案 1 :(得分:4)
你应该使用nvl()
作为codenheim的建议,但是对于原始解决方案的答案,你没有else
条款 - 所以没有任何东西与= null
匹配,你永远不会得到{ {1}},但 匹配的所有内容无论如何都默认为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
如果你有其他空格 - 也许只有一个SELECT NVL(TRIM(col_name), 'Empty Field') AS col_name
FROM table_name
- 那么你可以使用正则表达式去除它,例如:
tab
答案 2 :(得分:0)
正确的做法是使用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;