Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 "значение типа bit" и "предикат"  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Будем считать, что выражение, результат которого имеет тип bit - это bit-выражение.

bit-выражение нельзя использовать в качестве предиката
select * from sys.objects where cast(1 as bit) -- так нельзя, требуется предикат, а не выражение

предикат нельзя использовать в качестве bit-выражения
select ( 1 <> 2 ) from sys.objects -- так нельзя, требуется выражение, а не предикат

Вопрос к знатокам: зачем могло понадобиться явным образом различать такие понятия как "значение типа bit" и "предикат"? Что полезного могло дать (или дает ли) такое разделение понятий? Чем логика в MSSQL лучше (или хуже?) логики, например, в языке программирования C, C++, C#, где такого жесткого разделения понятий вообще нет. В c# есть просто выражения, и те из них, которые имеют тип Boolean могут легко могут быть использованы в качестве предикатов без ограничений.

зы: вопрос не совсем праздный.. моя команда в настоящий момент занимается реализацией генератора sql-кода. в качестве источника данных для генерации используется объектная модель запросов (рукописный Script\Query DOM), в которой использование предикатов в качестве выражений и наоборот принципиально не-запрещается, хотя и не поощряется. Каждое такое использование одного в качестве другого выливается в необходимость генерации соответствующего SQL-кода преобразований.

Поправьте меня, если я ошибаюсь..
7 июн 12, 22:25    [12684591]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
RubinDm
Чем логика в MSSQL лучше (или хуже?) логики, например, в языке программирования C, C++, C#, где такого жесткого разделения понятий вообще нет...


by design
8 июн 12, 06:37    [12684953]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
RubinDm
В c# есть просто выражения, и те из них, которые имеют тип Boolean

А в SQL этого типа отродясь не было. И MSSQL в этом плане плане ничем не отличается от кучи более других РБД. Вопрос о том, почему так было сделано, думаю, надо адресовать вот этому товарищу. Или этому.
8 июн 12, 07:36    [12684993]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
RubinDm
Будем считать, что выражение, результат которого имеет тип bit - это bit-выражение.

bit-выражение нельзя использовать в качестве предиката
select * from sys.objects where cast(1 as bit) -- так нельзя, требуется предикат, а не выражение

предикат нельзя использовать в качестве bit-выражения
select ( 1 <> 2 ) from sys.objects -- так нельзя, требуется выражение, а не предикат

Вопрос к знатокам: зачем могло понадобиться явным образом различать такие понятия как "значение типа bit" и "предикат"? Что полезного могло дать (или дает ли) такое разделение понятий? Чем логика в MSSQL лучше (или хуже?) логики, например, в языке программирования C, C++, C#, где такого жесткого разделения понятий вообще нет. В c# есть просто выражения, и те из них, которые имеют тип Boolean могут легко могут быть использованы в качестве предикатов без ограничений.



На мой взгляд (я могу ошибаться) если посмотреть запрос который помещается на 3 - 4-х листах, то понять откуда произошло это неявное условие будет весьма проблематично. И к тому же такое указание на порядок упрощает работу оптимизатора запросов. К тому же в запросе явно указываете тип переменных (потом конечно тип может измениться если он не подходит к типу содержимого колонок). Что позволяет легче подобрать объём требуемой оперативной памяти для выполнения запроса.
8 июн 12, 08:23    [12685089]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Сон Веры Павловны
RubinDm
В c# есть просто выражения, и те из них, которые имеют тип Boolean

А в SQL этого типа отродясь не было. И MSSQL в этом плане плане ничем не отличается от кучи более других РБД

тем не менее, в справке этому типу посвящен целый абзац. хотя по тексту и понятно, что он особенный, но явно не указано, что его нельзя привести к другим типам каким-либо образом
тип данных Boolean
Результат выполнения оператора сравнения имеет тип данных Boolean. Он может иметь одно из трех значений: TRUE, FALSE и UNKNOWN. Выражения, возвращающие значения типа Boolean, называются «логическими выражениями» ...
http://msdn.microsoft.com/ru-ru/library/ms188074.aspx
8 июн 12, 10:02    [12685597]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Shakill,
Ваша цитата слегка обрезана. В контексте данной темы упущено более важное, идущее ниже:
автор
В отличие от других типов данных SQL Server, тип Boolean не может быть типом столбца или переменной и не может быть возвращен в результирующем наборе.
8 июн 12, 12:14    [12686747]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Мне это тоже мешает жить, но как-то привык.
Не думаю, что это напрямую связано с оптимизатором.
PS Из всех языков программирования (коих я знаю безусловно очень мало), меня больше всего приколол PL/1 с возможностью сделать безусловный переход на метку, задаваемую в переменной!!! Я не понял как, но это компилировалось... и, кажется, даже работало... Реально я прихуйэл с этого. Мой преподаватель по программированию - тоже.
8 июн 12, 12:23    [12686826]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Сон Веры Павловны
Вопрос о том, почему так было сделано, думаю, надо адресовать вот этому товарищу.
На тот свет что ли?

В стандартах ANSI/ISO предусмотрен тип BOOLEAN.
Однако, Microsoft не торопится следовать этим стандартам.

http://savage.net.au/SQL/sql-99.bnf.html#keywords-B
8 июн 12, 13:49    [12687656]     Ответить | Цитировать Сообщить модератору
 Re: "значение типа bit" и "предикат"  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
iap
На тот свет что ли?

Примерно так. Если принимать иронию всерьез.

iap
В стандартах ANSI/ISO предусмотрен тип BOOLEAN.
Однако, Microsoft не торопится следовать этим стандартам.
http://savage.net.au/SQL/sql-99.bnf.html#keywords-B

А вы можете навскидку назвать того, кто уже поторопился?
8 июн 12, 14:01    [12687794]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить