Что означает это предложение SQL WHERE? - PullRequest
1 голос
/ 07 июля 2010

У меня возникли некоторые трудности в понимании следующего предложения WHERE в запросе T-SQL (SQL Server 2000/2005):

update #tempTable
SET
    Total_Avg=isnull(TerminationReason,'terminated'),
    Individual_Subscriptions=null,
    Business_Subscriptions=null,
    Other_subscriptions=null,
    -- snip. 10 more fields set to NULL.
    PMIE_BI=null,
    Digital_Editions_BI=null
where
(
    AbcTerminationDate<=dbo.fnGetPeriodFinalDate(@periodid)
    and (AbcTerminationDate!=19000101 or  AbcTerminationDate is  null)
    and (Total_Avg is not NULL or PrevTotalAvg is not NULL)
)

В частности, второе предложение нене имеет смысла - это 2 подпункта, разделенных оператором ИЛИ , кажутся противоречивыми.

Поле AbcTerminationDate объявлено как INT NULL в таблице под названием Участники .Я полагаю, что дата 19000101 в системе означает NULL или значение по умолчанию или отсутствие значения, т. Е. Член NOT завершен.Таким образом, запрос, по-видимому, очищает целый ряд полей / цифр, если элемент помечен как завершенный, что будет, если AbcTerminationDate равен NULL или имеет значение по умолчанию.

Не знаябольше информации, что ты с ней делаешь?

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

Похоже, они противоречивы.Возможно, они имели в виду and !(AbcTerminationDate==19000101 or AbcTerminationDate is null) ?

1 голос
/ 07 июля 2010

Независимо от того, что «19000101» подразумевает, оно не совпадает с NULL в глазах базы данных.NULL - это NULL.Если вы попытаетесь оценить любое другое значение в NULL, то это может стать проблематичным, потому что NULL означает «неизвестно».Например, 1 = NULL?Может быть, это так, а может и нет.На самом деле, вы даже не можете сказать, что NULL = NULL, потому что каждый NULL неизвестен, поэтому может совпадать или не совпадать с другим.Безопаснее всего явно проверить наличие условий NULL.

РЕДАКТИРОВАТЬ: Как я отмечаю в своем комментарии, если NULL должны быть включены, то первая часть запроса исключает это.Вот как это должно быть написано, если NULL должны быть включены:

(
    (
        (
            AbcTerminationDate <= dbo.fnGetPeriodFinalDate(@periodid) AND
            AbcTerminationDate != 19000101
        ) OR
        AbcTerminationDate is NULL
    ) AND
    (Total_Avg is not NULL or PrevTotalAvg is not NULL)
)
1 голос
/ 07 июля 2010

Если бы аргумент "or" находился вне группы (), он бы отрицал:

AbcTerminationDate<=dbo.fnGetPeriodFinalDate(@periodid) 

[править] По сути, это говорит о том, что из этого 1-го предложения берутся все результаты, которые являются истинными, и выполняем дополнительный фильтр, чтобы убедиться, что это не 19000101 или его значение NULL, и, скорее всего, это исключительные значения для функции fnGetPeriodFinalDate для правильной оценки.

...