Есть ли причина, по которой вы не можете выбрать оператор как бит в SQL Server? - PullRequest
5 голосов
/ 30 июня 2010

Мне интересно, почему не получается следующее:

SELECT price<500 as PriceIsCheap

и заставляет вас сделать следующее:

SELECT CASE WHEN (price<500) THEN 1 ELSE 0 END as PriceIsCheap

Когда согласно ответу на этот связанный вопрос , таблица преобразования говорит о том, что должно происходить неявное преобразование.

Ответы [ 4 ]

6 голосов
/ 30 июня 2010

В SQL нет логического типа данных, BIT является своего рода хаком, но основная проблема в том, что из-за концепции SQL NULL true логическая логика невозможна (например, что бы ваш запрос вернул, если бы price было NULL?)

Обратите внимание, что я не говорю, что не существует возможных способов реализации логической логики, которые "в основном" работают (например, вы могли бы сказать, что TRUE OR NULL - это NULL или что-то еще) что люди, разработавшие стандарт SQL, не могли принять решение об Едином истинном представлении для логической логики (например, вы также можете утверждать, что TRUE OR NULL - это TRUE, поскольку TRUE OR <anything> - это TRUE).

Логические выражения (=, <=,> = и т. Д.) Действительны только в определенных местах (в частности, в WHERE предложениях и CASE метках), но не в других местах.

3 голосов
/ 30 июня 2010

Ну, вы также обнаружите, что не можете, если у вас есть битовый столбец с именем IsCheap do SELECT * FROM STUFF WHERE IsCheap, вам нужно сделать WHERE IsCheap=1.

Причина проста, тип данных немного, а не bool. Правда, это, по сути, единственное использование, к которому вы его примените, и оно неявно преобразуется практически любой средой доступа к данным, но технически оно все же немного с 0 или 1, а не с логическим значением true или false. Мы все видим очевидную связь, но SQL не был написан с таким предположением, поэтому мы должны предоставить логику для преобразования true / false в 1 / 0.

2 голосов
/ 30 июня 2010

Выражение price < 500 возвращает значение логическое : ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО.Это не значение data , поэтому вам нужно использовать выражение CASE для возврата соответствующего значения данных.


FWIW Механизм базы данных Microsoft Access действительно обрабатываетрезультаты выражений в виде значений данных, например, вы можете задавать всевозможные дурацкие вопросы, такие как:

SELECT 1 = 1, 1 = NULL, 1 <> NULL, 1 IN (NULL)
  FROM Foo;

... и он с радостью даст ответы, но, конечно, это просто доказывает, что Access не реализует SQLязык!

0 голосов
/ 30 июня 2010

Я не MSSQL человек, но я столкнулся с той же проблемой с Oracle. Тривиальный ответ таков: логический тип не является допустимым типом столбца в этих базах данных. Теперь, почему они решили, что вам не нужны булевы значения, так как значения можно догадаться.

@ paxdiablo, это так не хватает смысла ... Пример ОП - просто минимальный пример. Это все еще упрощенный, но реальный пример: рассмотрим таблицу People, содержащую имена и возраст. Вы хотите получить всех людей, но также хотите знать, являются ли они несовершеннолетними. Как в MySQL, так и в PostgreSQL вы можете написать

SELECT name, age < 18 AS minor FROM people
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...