Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
Тут с другом произошел такой теоритический спор. Допустим есть такой скрипт set ansi_nulls on declare @t table(i int null) insert @t select 1 union select null if (2 in (select * from @t)) print 'in' else print 'out' if not (2 in (select * from @t)) print 'in' else print 'out' Последние две строки отличаются наличием not в условии и на первый взгляд в любом случае должны давать разный результат. Однако результат будет одинаков. Вопрос в следующем: можно ли это считать ошибкой в SQL сервере? С одной стороны если стоит set ansi_nulls on, то значение операции по сравнению с null-ом неопределено, но с другой стороны можно ли считать конструкцию in (select ...) сравнением? Явно это нигде не описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 11:31 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
> но с другой стороны можно ли считать конструкцию in (select ...) сравнением Я думаю можно, если я ничего не путаю то конструкцией (2 in (select * from @t)) мы проверяем является ли множество "2" подмножеством @t, и как это можно проверить без сравнения? Под рукой нет книжек, а исчисление предикатов 1-го порядка я уже изрядно подзабыл, думаю в данном случае и теорией это можно подтвердить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 12:41 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
В данном случае это все равно что if 2=1 or 2=null print 'in' else print 'out' if NOT (2=1 or 2=null) print 'in' else print 'out' --FALSE or NULL = FALSE --NOT (FALSE or NULL)=NOT(NULL)=FALSE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 12:46 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
Сравнение. Запрос вида: select * from table1 where id in (select id from table2) можно переделать в: select * from table1 join table2 on table2.Id = table1.Id как раз сравнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 13:59 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
Согласен с Genady насчет "как проверить без сравнения". А план выполнения показывает что будет использоваться Table Scan в 1-ом случае OBJECT: (@t) WHERE: (2=@t.(i)) во 2-ом OBJECT: (@t) WHERE: (@t.(i)=NULL OR 2=@t.(i)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 14:02 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
2 Glory Какой план выполнения данных запросов совершенно не важно, просто оператор if работает с двузначной логикой, т.е. на выходе получим либо True либо false, в СУБД же однако введено еще одно значение ("Не знаю", точнее "неопределено" ) поэтому возникает вопрос входит ли значение два в множество значений, среди которых есть хрен его знает какие. Самый простейший способ определить это взять и перебрать множество и сравнить значения, ну и естественно тут же возникает вопрос а каким будет результат сравнения 2 с "хрен его знает с чем"? Если флаг set ansi_nulls включен, то один "хрен его знает что" не равно другому "хрен его знает что", а если выключен, то мы просто к домену возможных значений добавляем еще одно - "хрен его знает что" и тогда 2 <> Null, впрочем это всем понятно, вопрос SergSuper-а является выражение in сравнением? Я думаю да, почему описал выше. p.s. Сорри за несколько вольную трактовку значения Null ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 15:02 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
А я бы не спешил оправдывать мелко-мягких в том, что - "все работает как предписано..." Возьмем 4 цитаты из BOL по поводу упомянутых выше выражений: \n1. IN (T-SQL) - Determines if a given value matches any value in a subquery or a list. Result Type - Boolean Result Value - TRUE or FALSE. Определились - "IN (T-SQL)" это логическое выражение. \n2. SET ANSI_NULLS (T-SQL) - Specifies SQL-92 compliant behavior of the Equals (=) and Not Equal to (<> comparison operators when used with null values. Remarks: The SQL-92 standard requires that an equals (=) or not equal to (<> comparison against a null value evaluates to FALSE. Определились еще раз - SET ANSI_NULLS - устанавливает соответствие стандарту SQL-92, и даже уточнили - что именно стандарт предусматривает. \n3. Operator Precedence - When a complex expression has multiple operators, operator precedence determines the sequence in which the operations are performed. NOT AND ALL, ANY, BETWEEN, IN, LIKE, OR, SOME Оказыватся - логический оператор IN - аж на 2 уровня выше приоритетом, чем NOT. Вот и к противоречию пришли - по стандарту SQL-92 - IN должен вернуть FALSE, а NOT - обязан его перевернуть в TRUE. Почему же этого не происходит? А вот почему: \n4. When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. Оба-на!! Оказывается у логических операторов, кроме TRUE и FALSE, появилось еще одно значение - UNKNOWN... (цитаты насчет того, что ветки выполнения в выражениях типа IF в этом случае идут как по FALSE я не нашел, но по контексту - можно догадаться). Выходит - мелко-мягкие уже давно реализовали "троичную логику", а мы об этом даже и не догадывались... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 08:05 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
Кстати, вот такая конструкция работает одинаково правильно - вне зависимости от установок SET ANSI_NULLS: if exists (select * from @t where i=2) print 'in' else print 'out' if not exists (select * from @t where i=2) print 'in' else print 'out' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 08:50 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
2 qu-qu >Выходит - мелко-мягкие уже давно реализовали "троичную логику", а мы об этом даже и не догадывались... Похоже об этом не догадывались только вы это достаточно известная проблема, я не работал с другими СУБД, но есть у меня стойкое подозрение что там ситуация такая же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 11:18 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
Есть такое дело. create table... ... b bit NULL ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 11:36 |
|
||
|
особенности конструкций ... in (select ...)
|
|||
|---|---|---|---|
|
#18+
2 qu-qu Рекомендую http://www.akzhan.midi.ru/devcorner/articles/DDP-Representation-of-an-absent-information-rus.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 11:45 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32022989&tid=1823906]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 317ms |
| total: | 573ms |

| 0 / 0 |
