问题描述
|
我正在使用以下查询:
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键匹配。这样做的危险是,您可能会有比真正相关的更多的比赛。但是,提供的查询应该都适合您。