Как записать условие "x = y" так, чтобы оно было истинным, когда оба x и y равны NULL? - PullRequest
3 голосов
/ 28 мая 2011

Я использую следующий запрос:

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]) * - это альтернатива COALESCE в Access.)

Одна вещь, которую я хотел бы знать,если я использую WHERE tblTxn.Type=tblAccounts.Type OR Nz(tblTxn.Type,0) = Nz(tblAccounts.Type,0), он показывает тот же результат.Как ваш запрос работал с ненулевыми значениями, когда вы сопоставляли только нулевые значения?

Ответы [ 3 ]

1 голос
/ 28 мая 2011

Ваш запрос проверяет 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
1 голос
/ 28 мая 2011

Вам потребуется использовать 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;
0 голосов
/ 28 мая 2011
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, будут сопоставлены.Существует опасность, что у вас будет больше совпадений, чем на самом деле.Но предоставленный запрос должен удовлетворить вас в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...