我使用以下查询:
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.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)
,它会显示相同的结果。当您仅匹配空值时,您的查询如何使用非空值?
答案 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键匹配。存在的危险是,您可能会获得比真正相关的更多匹配。但是,提供的查询应该适合您。