首页 > 解决方案 > Null 的关系运算符问题

问题描述

我在插入关系运算符时遇到以下 select 语句未获取数据的问题。

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID AND
  B.AR_PR_EMP_ID = C.ID AND
  A.ONHAND <= 0 AND
  A.CUSER7 = 'Y' AND
  A.PK_HIDE <> 'Y'

如果我删除语句的最后一行 (A.PK_HIDE <> 'Y'),它将获取我期望看到的数据。PK_HIDE 列中只有 3 个不同的值,“Y”、“N”或 Null。删除最后一行时,我选择了 PK_HIDE = 'N' 的数据集。

我也试过这个说法:

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID AND
  B.AR_PR_EMP_ID = C.ID AND
  A.ONHAND <= 0 AND
  A.CUSER7 = 'Y' AND
  A.PK_HIDE = 'N' OR A.PK_HIDE IS NULL

该语句似乎被忽略了,因为它使用OR(A.CUSER7 = 'Y')提取所有数据集。A.PK_HIDE = 'N'A.PK_HIDE IS NULL

任何帮助表示赞赏。先感谢您。

标签: sqloracleplsqloracle11goracle-sqldeveloper

解决方案


如果您想在第一个查询中正确管理空值,您应该为 PK_HIDE 使用 NVL

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID 
AND B.AR_PR_EMP_ID = C.ID 
AND A.ONHAND <= 0 
AND A.CUSER7 = 'Y' 
AND NVL(A.PK_HIDE, 'N') <> 'Y'

在第二个中,您必须将 PK_HIDE 的条件包装在 ( )

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID 
AND B.AR_PR_EMP_ID = C.ID 
AND A.ONHAND <= 0 
AND A.CUSER7 = 'Y' 
AND ( A.PK_HIDE = 'N' OR A.PK_HIDE IS NULL) 

如果你不使用 ( A.PK_HIDE = 'N' OR A.PK_HIDE IS NULL) 你的 where 条件相当于

WHERE ( A.ARCUSTO_ID = B.ID 
AND B.AR_PR_EMP_ID = C.ID 
AND A.ONHAND <= 0 
AND A.CUSER7 = 'Y' 
AND A.PK_HIDE =  ) 
OR A.PK_HIDE IS NULL

显然会产生错误的结果


推荐阅读