案例陈述在Oracle中没有按预期工作

时间:2014-07-31 13:00:36

标签: sql 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

3 个答案:

答案 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

SQl Fiddle demo

答案 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;