当x和y均为NULL时,如何写条件“ x = y”呢?

问题描述

| 我正在使用以下查询
SELECT tblTxn.Currency,tblTxn.Amount,tblTxn.Desc,tblAccounts.Account,tblTxn.Type
FROM tblAccounts
    INNER JOIN tblTxn ON (tblAccounts.Currency = tblTxn.Currency)
WHERE
    tblTxn.Type=tblAccounts.Type OR 
    (tblAccounts.Type Is Null And tblAccounts.Type Is Null);
tblTxn.Type
tblAccounts.Type
可以具有值或空值。 我需要两者搭配。空值显示预期结果,但不显示。 如何解决这个问题? 我在MS Access 2007中使用查询。从以下解决方案中,我将查询调整为:
SELECT tblTxn.Currency,tblTxn.Type FROM tblAccounts INNER JOIN tblTxn ON tblAccounts.Currency = tblTxn.Currency WHERE Nz(tblTxn.Type,0) = Nz(tblAccounts.Type,0)
现在正在显示预期结果。感谢您的大力支持。 NB。(函数Nz(Value,[ValueIfNull])是Access中的COALESCE替代。) 我想知道的一件事,如果我使用
WHERE  tblTxn.Type=tblAccounts.Type OR Nz(tblTxn.Type,0)
,它会显示相同的结果。当您仅匹配空值时,您的查询如何与非空值一起使用?     

解决方法

        您的查询两次检查
tblAccounts.Type Is Null
。如果将一个
tblAccounts.Type Is Null
条件替换为
tblTxn.Type Is Null
,该查询将起作用。 您也可以这样做:
DECLARE @FakeString VARCHAR(10)
SET @FakeString = \'!@#$%^&\'

SELECT tblTxn.Currency,tblTxn.Amount,tblTxn.Desc,tblAccounts.Account,tblTxn.Type
FROM tblAccounts 
    INNER JOIN tblTxn ON tblAccounts.Currency = tblTxn.Currency
WHERE 
    ISNULL(tblTxn.Type,@FakeString) = ISNULL(tblAccounts.Type,@FakeString)
如果值是整数,则可以执行以下操作
DECLARE @FakeType INT
SET @FakeType = -9999
    ,        您需要使用IsNull来检查空值。 请参见MSDN:ISNULL(Transact-SQL)(假定SQL Server) 不知道这是否会完全满足您的要求-但应指出正确的方向。
SELECT  tblTxn.Currency,tblTxn.Type 
FROM    tblAccounts 
        INNER JOIN tblTxn ON (tblAccounts.Currency = tblTxn.Currency) 
WHERE   IsNull(tblTxn.Type,\'\') =IsNull(tblAccounts.Type,\'\') 
    OR COALESCE(tblAccounts.Type,tblAccounts.Type) Is Null;
    ,        
SELECT tblTxn.Currency,tblTxn.Type
FROM tblAccounts
INNER JOIN tblTxn ON tblAccounts.Currency = tblTxn.Currency
WHERE ISNULL(tblTxn.Type,\'\') = ISNULL(tblAccounts.Type,\'\')
--  This works as well
--  WHERE COALESCE(tblTxn.Type,\'\') = COALESCE(tblAccounts.Type,\'\')
使用
ISNULL
并返回空字符串将使您的NULL键匹配。这样做的危险是,您可能会有比真正相关的更多的比赛。但是,提供的查询应该都适合您。