如何编写条件“x = y”使得当x和y都为NULL时为真?

时间:2011-05-28 04:03:02

标签: sql join null

我使用以下查询:

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.TypetblAccounts.Type可以包含值或空值 我需要两个匹配。空值显示预期结果,但值不是。

如何解决这个问题?


我在MS Access 2007中使用了该查询。从下面的解决方案我调整了查询​​:

SELECT tblTxn.Currency, tblTxn.Amount, tblTxn.Desc, tblAccounts.Account, 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) = Nz(tblAccounts.Type,0),它会显示相同的结果。当您仅匹配空值时,您的查询如何使用非空值?

3 个答案:

答案 0 :(得分:1)

您需要使用IsNull来检查空值。

请参阅MSDN:ISNULL (Transact-SQL)(假设SQL Server)

不确定这是否完全符合您的要求 - 但应指向正确的方向。

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, '') =IsNull(tblAccounts.Type,'') 
    OR COALESCE(tblAccounts.Type, tblAccounts.Type) Is Null;

答案 1 :(得分:1)

您的查询检查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)

如果value是整数,你可以这样做

DECLARE @FakeType INT
SET @FakeType = -9999

答案 2 :(得分:0)

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,'') = ISNULL(tblAccounts.Type,'')
--  This works as well
--  WHERE COALESCE(tblTxn.Type,'') = COALESCE(tblAccounts.Type,'')

使用ISNULL并返回空字符串将使您的NULL键匹配。存在的危险是,您可能会获得比真正相关的更多匹配。但是,提供的查询应该适合您。