1

有人可以解释一下 oracle db 中以下查询的功能,以及为什么它不返回最后一个空行。如果是空值,请不要解释我的功能。

Table Store_Information
store_name    Sales  Date
Los Angeles   $1500  Jan-05-1999
San Diego      $250  Jan-07-1999
San Francisco  $300  Jan-08-1999
Boston         $700  Jan-08-1999
(null)         $600  Jan-10-1999


SELECT *
FROM scott.Store_Information
WHERE store_name IN (null)

STORE_NAME           SALES                DATE                      
-------------------- -------------------- ------------------------- 

0 rows selected
4

5 回答 5

6
SELECT *
FROM scott.Store_Information
WHERE store_name IS null;

NULL 不能与其他(实际)值“比较”。因此,您必须使用IS NULLor IS NOT NULL

以下是有关此主题的一系列博客文章:http: //momjian.us/main/blogs/pgblog/2012.html#December_26_2012

于 2013-01-11T21:15:57.517 回答
1

如果您要查找的值为空值,则查询应为:

SELECT *
FROM scott.Store_Information
WHERE store_name IS NULL;
于 2013-01-11T21:16:13.087 回答
0

如果您希望查询选择字段为空值,您可以:解决方案 1:使用 where ... IS NULL ...

解决方案 2:或者如果您想绝对使用 IN,您可以使用 NVL,例如:

SELECT * FROM scott.Store_Information WHERE NVL(store_name, 'NULL_STORE_NAME') IN ('NULL_STORE_NAME')

但在第二种情况下,您假设您不能拥有名为“NULL_STORE_NAME”的商店名称......所以我认为通常最好使用解决方案 1......

于 2013-01-12T22:14:13.450 回答
0

Oracle NULLS 很特殊

什么都不等于 null
什么都不等于 null

由于in等效于 a = any,因此这也适用于in

因此,您不能在inornot in子句中使用 NULL 并期望得到正确的结果。

于 2013-01-11T21:19:22.173 回答
0

Null 是一个特殊值,它不遵循字符串或数字比较的常规约定。除非您使用一些特殊的内置函数,否则使用这些常用方法评估 null 将始终评估为 FALSE。

Select * from Store_Information
where nvl(store_name,'') in ('')

Select * from store_information
where coalesce(store_name, 'Missing') in ('Missing')

Select * from store_information 
where store_name is null
于 2013-01-11T21:21:35.643 回答