Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Как написать "не равны" для nullable поля?  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Как одной строкой написать следующий предикат:
price is null and @price is not null
	or price is not null and @price is null
	or price <> @price

Смысл предиката проверить, что price не равен @price. Оба значения могут содержать null.
16 авг 12, 08:26    [13018464]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
ISNULL(price, -1) = ISNULL(@price, -2) при условии что цены больше нуля.
16 авг 12, 08:37    [13018482]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Kudep,Если все правильно понял,то что-то в этом духе
...
where isNull(price,-100)<>isNull(@price,-101)

можно посмотреть в эту сторону
..
where exists(select price except select @price)
16 авг 12, 08:48    [13018509]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Программист-Любитель
ISNULL(price, -1) = ISNULL(@price, -2) при условии что цены больше нуля.

как вариант, спасибо.
Вот так получается:
ISNULL(price, -1) <> ISNULL(@price, -1))
16 авг 12, 08:48    [13018513]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
denis2710
Kudep,Если все правильно понял,то что-то в этом духе
...
where isNull(price,-100)<>isNull(@price,-101)

можно посмотреть в эту сторону
..
where exists(select price except select @price)
Как мы тут давно установили, лучше
WHERE NOT EXISTS(SELECT price INTERSECT SELECT @price)
16 авг 12, 09:04    [13018556]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
aleks2
Guest
iap

Как мы тут давно установили, лучше
WHERE NOT EXISTS(SELECT price INTERSECT SELECT @price)


Не. Нифига непонятно без длительной медитации.
16 авг 12, 09:24    [13018631]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
aleks2,
+ Доп. материал к медитации


declare @t table ( id int unique )
insert  into @t
        ( id )
values  ( null ) ;
with  L0
        as ( select 1 as c
             union all
             select 1
           ) ,
      L1
        as ( select 1 as c
             from   L0 as A
             cross join L0 as B
           ) ,
      L2
        as ( select 1 as c
             from   L1 as A
             cross join L1 as B
           ) ,
      L3
        as ( select 1 as c
             from   L2 as A
             cross join L2 as B
           ) ,
      L4
        as ( select 1 as c
             from   L3 as A
             cross join L3 as B
           ) ,
      L5
        as ( select 1 as c
             from   L4 as A
             cross join L4 as B
           ) ,
      Nums
        as ( select row_number() over ( order by ( select 0
                                                 ) ) as n
             from   L5
           )
  insert  into @t
          ( id
          )
          select top ( 1000000 )
                  n
          from    Nums
          order by n ;

declare @id int = null ;

select  *
from    @t
where   not exists ( select id
                     intersect
                     select @id )
--where exists(select id except select @id)
select  *
from    @t
where   exists ( select id
                 except
                 select @id )

16 авг 12, 09:29    [13018645]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
aleks2
Guest
1. Мудреные конструкции для простых вещей - ущербны по-определению.
2. Тредстартеру следует просто избавится от null, как класса. Это эффективнее.
16 авг 12, 09:55    [13018745]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleks2
следует просто избавится от null, как класса.
Ага и как? Нельзя от понятия "нет данных" избавиться. И не только у TSQL эта проблема, на C#/.Net тоже жалуются.
А вот был бы банально отдельные операторы (аля == и =!=) который для NULL работал соответствующе и ни у кого проблем не было. Ан нет епитесь.
Проблема в том что не всё так линейно в системах. Это вполне себе нормальная логика.

IsNull и NOT Exists INTERSECT - костыли.

Кто думает иначе?
16 авг 12, 18:24    [13022566]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Mnior
aleks2
следует просто избавится от null, как класса.
Ага и как? Нельзя от понятия "нет данных" избавиться.
Кто думает иначе?
Как пример ISO/IEC 5218 подойдет?
17 авг 12, 09:47    [13024580]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
andrey odegov
Mnior
пропущено...
Ага и как? Нельзя от понятия "нет данных" избавиться.
Кто думает иначе?
Как пример ISO/IEC 5218 подойдет?
Это хорошо для перечислимых значений, когда есть словарь.

А для полей типа цена или вес нужно будет договариваться о специальных значениях для понятия "нет данных". Это менее прозрачно, чем специально предназначенная пометка "нет данных" (в виде NULL) во всех СУБД, зачем придумывать ещё одну, индивидуальную для каждой системы?
17 авг 12, 10:04    [13024672]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Физическое понятие "вес" или экономическое "цена" могут быть отрицательны?
Для температуры есть "абсолютный нуль".
Понятие "домен" не зря существует.
17 авг 12, 11:37    [13025319]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35385
Блог
andrey odegov,

цена таки может быть отрицательной
17 авг 12, 11:43    [13025369]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
мимо
Guest
Mnior
А вот был бы банально отдельные операторы (аля == и =!=) который для NULL работал соответствующе и ни у кого проблем не было. Ан нет епитесь.
Проблема в том что не всё так линейно в системах. Это вполне себе нормальная логика.

IsNull и NOT Exists INTERSECT - костыли.

Кто думает иначе?

Так для нала есть is null и is not null, а ещё что надо?
17 авг 12, 11:56    [13025492]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
мимо, не читай @ сразу отвечай
Kudep
price is null and @price is not null
	or price is not null and @price is null
	or price <> @price
Mnior
А вот был бы банально отдельные операторы (аля == и =!=) который для NULL работал соответствующе и ни у кого проблем не было.

=============
andrey odegov
Понятие "домен" не зря существует.
Проигнорировали alexeyvg?
Не каждый тип есть "домэн".
И в добавок не все типы поддерживают отрицательные значения.
По вашей логике понятия NULL вобще не должно было быть никогда.

Банально не хватает операторов.
Регить Suggestion или рано?
17 авг 12, 13:05    [13026162]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Mnior,

BOL
A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.
Так что если уж регить Suggestion, то для введения значения EMPTY, а не для спецоператоров.
17 авг 12, 13:45    [13026473]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
invm
Mnior,

BOL
A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.
Так что если уж регить Suggestion, то для введения значения EMPTY, а не для спецоператоров.
А в стандарте что-то подобное есть?
17 авг 12, 13:54    [13026558]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
iap
А в стандарте что-то подобное есть?
Не встречал. Может плохо смотрел.
Лично меня пока устраивает NULL, несмотря на его подчинение принципу "тут играем, тут не играем, а тут рыбу заворачивали".
17 авг 12, 14:22    [13026766]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
andrey odegov
Физическое понятие "вес" или экономическое "цена" могут быть отрицательны?
Для температуры есть "абсолютный нуль".
Понятие "домен" не зря существует.
Не, конечно, можно для каждого поля подобрать такие значения. Но вполне нормально использовать и стандартное значение для этого.

Я уж не говорю, что иногда подобрать сложно или невозможно (пусть это редкие случаи).
17 авг 12, 14:29    [13026817]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
invm
Так что если уж регить Suggestion, то для введения значения EMPTY, а не для спецоператоров.
Так EMPTY уже есть, допустим, для числа это 0, для строки это пустая строка. Или вы про что то другое?
17 авг 12, 14:31    [13026833]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
alexeyvg,

0, пустая строка и т.п., это все-таки значения, которые при одних условиях могут трактоваться как маркер "нет данных", а при других не могут. Наверное, имело бы смысл иметь универсальный маркер для этих целей, т.к. NULL не подходит.
17 авг 12, 15:36    [13027463]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm
BOL
A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.
Так что если уж регить Suggestion, то для введения значения EMPTY, а не для спецоператоров.
Ха, так в том-то и проблема.
Да, значение NULL одного Price не равно значения NULL другого Price. Но при поиске использовать частично "понятийное" сравнение.
Т.е. это именно разные операторы, одно "равенство", другое ... назовём похожесть/непохожесть.
А вам подавай только линейные/зеркальные/чистые/"брильянтовые" отношения?! Отношения бывают любой нелинейности. И данное встречается на практике чаще, даже чем некоторые другие операторы/функции.

Был же ведь SET ANSI_NULLS OFF, подход был гимно - просто должен быть соответствующий оператор.

Вот что пишет педивикия:
WikiPedia
Criticisms

The ISO SQL implementation of Null is the subject of criticism, debate and calls for change. In The Relational Model for Database Management: Version 2, Codd suggested that the SQL implementation of Null was flawed and should be replaced by two distinct Null-type markers. The markers he proposed were to stand for "Missing but Applicable" and "Missing but Inapplicable", known as A-values and I-values, respectively. Codd's recommendation, if accepted, would have required the implementation of a four-valued logic in SQL.[3] Others have suggested adding additional Null-type markers to Codd's recommendation to indicate even more reasons that a data value might be "Missing", increasing the complexity of SQL's logic system. At various times, proposals have also been put forth to implement multiple user-defined Null markers in SQL. Because of the complexity of the Null-handling and logic systems required to support multiple Null markers, none of these proposals have gained widespread acceptance.
Chris Date and Hugh Darwen, authors of The Third Manifesto, have suggested that the SQL Null implementation is inherently flawed and should be eliminated altogether,[16] pointing to inconsistencies and flaws in the implementation of SQL Null-handling (particularly in aggregate functions) as proof that the entire concept of Null is flawed and should be removed from the relational model.[17] Others, like author Fabian Pascal, have stated a belief that "how the function calculation should treat missing values is not governed by the relational model."
И вообще все эти "рассуждение" словно поковырялись детской лопаткой - поверхностно всё и не профффессионально. На нас видимо спихнули На потомков проблему оставили.

Applicable/Inapplicable - пусть решает разработчик. Часто оно нужно и часто имеет одно конкретное понятие в одном месте. А с другой многогранно. В одном запросе надо одно, в другом другое.
Как запись в таблицу и сравнения двух сущностей, то Inapplicable, как поиск, так Applicable.
Т.к. мы уже имеем NULL (как одно понятие) то возможно только две группы операторов. Одну имеем, осталось добавить вторую.
А далее пусть каждый сам решает, кто что где будет использовать/не использовать.

У кого другие соображения?
17 авг 12, 15:40    [13027501]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
мимо
Guest
Mnior
Но при поиске использовать частично "понятийное" сравнение.

Это как? При определенных обстоятельствах +100500 миллионов = бесконечность, что в свою очередь, можно описать как неопределённость и приравнять к null (данных так много, что можно сказать, что их нет)?
17 авг 12, 16:50    [13028016]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
invm
alexeyvg,

0, пустая строка и т.п., это все-таки значения, которые при одних условиях могут трактоваться как маркер "нет данных", а при других не могут. Наверное, имело бы смысл иметь универсальный маркер для этих целей, т.к. NULL не подходит.
EMPTY - это же не маркер "нет данных", это совершенно определённое значение (своё для каждого типа данных).

По крайней мере так его понимают в других ЯП, там, где есть EMPTY.

Иначе вообще непонятно, что вы хотите - что бы NULL переименовали в EMPTY, полностью сохранив правила работы с ним?

invm
NULL не подходит.
Непонятно, почему?

Вот как раз если вам нужен маркер "нет данных", то это как раз он и есть.
17 авг 12, 16:55    [13028056]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "не равны" для nullable поля?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
alexeyvg
invm
alexeyvg,

0, пустая строка и т.п., это все-таки значения, которые при одних условиях могут трактоваться как маркер "нет данных", а при других не могут. Наверное, имело бы смысл иметь универсальный маркер для этих целей, т.к. NULL не подходит.
EMPTY - это же не маркер "нет данных", это совершенно определённое значение (своё для каждого типа данных).

По крайней мере так его понимают в других ЯП, там, где есть EMPTY.

Иначе вообще непонятно, что вы хотите - что бы NULL переименовали в EMPTY, полностью сохранив правила работы с ним?

invm
NULL не подходит.
Непонятно, почему?

Вот как раз если вам нужен маркер "нет данных", то это как раз он и есть.
Не важно как это значение будет храниться, важно, чтобы интерпретировалось оно везде одинаково, а то NULL в предикатах трактуется как UNKNOWN, а в операциях UNION, DISTINCT, GROUP BY, ORDER BY и т.п., -- как EMPTY.
17 авг 12, 19:23    [13028746]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить