Sql查询dosen';不能给出正确的输出

Sql查询dosen';不能给出正确的输出,sql,oracle10g,Sql,Oracle10g,在上述查询中,p_p_id、p_c_编号、p_m_编号和p_s_编号被传递到此查询,但此查询在某些情况下给出了错误的输出: 在表abc c_数、m_数、s_数可以为空、零或任何其他值 如果为空,我想匹配c_编号,如果为空,则匹配p_c_编号 但上述查询的问题是,如果c_number为null,则将零分配给c_number,如果p_c_number已经为零,则它将null与零值匹配 请帮助..我正在使用oracle作为rdbms 尝试将每个nvl条件替换为以下条件 SELECT MAX(date)

在上述查询中,p_p_id、p_c_编号、p_m_编号和p_s_编号被传递到此查询,但此查询在某些情况下给出了错误的输出: 在表abc c_数、m_数、s_数可以为空、零或任何其他值 如果为空,我想匹配c_编号,如果为空,则匹配p_c_编号 但上述查询的问题是,如果c_number为null,则将零分配给c_number,如果p_c_number已经为零,则它将null与零值匹配 请帮助..我正在使用oracle作为rdbms


尝试将每个
nvl
条件替换为以下条件

SELECT MAX(date)
                    FROM abc
                   WHERE 
                      p_id=p_p_id
                     AND nvl(c_number,0)=nvl(p_c_number,0) 
                     AND nvl(m_number,0)=nvl(p_m_number,0)
                     AND nvl(s_number,0)=nvl(p_s_number,0);
或者如图所示

AND (c_number = p_c_number OR (c_number IS NULL AND p_c_number IS NULL))

…所以使用
为空的组合
?(例如,
x是空的,y是空的
——当然,也许Oracle有一些诡计来做上述工作。
COALESCE
IFNULL
甚至可以使用--
COALESCE(a,b)是空的
只有当
a
b
为空时才是真的——但只要KISS.and((c\u数为空,p\u数为空)或(c_编号=p_c_编号))…我知道这个解决方案,但如果有什么不同possible@guarav可以将NVL/NZ与不同的sentinel值一起使用——只需保证sentinel值永远不会用于有效数据。-在某些情况下,1可能是合适的。不过,我会重写查询。@gaurav您期望什么?为什么不使用此应用程序ble?@guarave在SQL Server中可以禁用“ANSI NULLS”…我真的希望Oracle没有类似的非标准语义黑客;-)@phil:我期待着一些不同的东西,我知道上面的方法更合适,谢谢你的解决方案
AND (c_number = p_c_number OR COALESCE(c_number, p_c_number) IS NULL)