Sql NVL列和NULL

Sql NVL列和NULL,sql,oracle11g,Sql,Oracle11g,我有如下所示的行 ProductId ProductName ProductDesc ProductLoc 101 Camel Pencil B-10 102 Parker Pen 103 Mirado Pen C-10 当我执行以下SQL查询时 SELECT * FROM ta

我有如下所示的行

ProductId   ProductName      ProductDesc      ProductLoc
101         Camel             Pencil           B-10
102         Parker            Pen              
103         Mirado            Pen              C-10
当我执行以下SQL查询时

SELECT *
  FROM tablename
 WHERE productloc = NVL ('', productloc)
它给出了第1行和第3行,我想实现的是,若productloc在SQL的where条件下为null,那个么我应该得到所有三行

如何获得所需的输出。

尝试以下方法:

SELECT *
  FROM tablename
 WHERE nvl(productloc,'zzz') = (case when productloc is null then 'zzz' else productloc end )

这里zzz是一些虚拟值,否则不应作为值出现在特定列中。

我假设有三种不同的解决方案:

如果需要所有行(带
productloc
null和值),可以编写以下查询:

SELECT *
FROM tablename
SELECT *
FROM tablename
WHERE productloc IS NULL OR productloc = YOURVARIABLE
没有
WHERE
子句

如果要使用
productloc
提取所有具有指定值或为空的行,则可以编写以下查询:

SELECT *
FROM tablename
SELECT *
FROM tablename
WHERE productloc IS NULL OR productloc = YOURVARIABLE
或(最后一个,不使用
条件)


从tablename中选择*

在这种情况下是你需要的,因为你的where不起作用。您可以将列与自身进行比较

如果您想过滤并包含空值,您可以这样做(但可能会用一些值替换一个
productloc


从表名中选择*,其中productloc=productloc或productloc为空;

或:


select*from tablename,其中nvl(productloc,'SOME_UNIQUE_VAL')=nvl(productloc,'SOME_UNIQUE_VAL');


还可以将
productloc
中的一个替换为某个值。

我假设您使用的是Oracle。在Oracle中,“NULL”不是一个值,因此任何比较函数都将返回false

我建议:

SELECT *  
  FROM tablename  
 WHERE (productloc = productloc OR productloc IS NULL)  
希望有帮助,

Sérgio

hmm..productloc与productloc在同一个表中进行比较..为什么?如果删除where语句,将得到所有行..两边保留nvl。
nvl('',productloc)
始终返回
productloc
,因为在Oracle中
'
等于
null
,请共享预期的最终结果。如果val为null,如果val不为null。。