Есть ли способ получить логическое значение без приведения в SQL Server? - PullRequest
6 голосов
/ 22 июня 2010

Мне показалось очень странным, что такой простой код недействителен:

select * from table where field=true

Альтернатива, по-видимому,

select * from table where field='true'

Хорошо, думаю, я могу жить с этим. По той или иной причине мне недавно пришлось сделать что-то подобное:

select true as somefield,...

Альтернатива для получения типов и всего правильного была намного более безобразной:

select cast('true' as bit) as somefield,...

Я что-то упустил? Есть ли какой-нибудь способ, позволяющий получить истинное или ложное значение как логическое значение без приведения?

Ответы [ 6 ]

18 голосов
/ 22 июня 2010

Биты - это тип данных, наиболее часто используемый для представления логического значения в TSQL.Я обычно делаю что-то вроде этого

select CAST(1 as bit) as somefield
6 голосов
/ 14 февраля 2011

Значения 'TRUE' и 'FALSE' являются специальными строками, которые можно неявно преобразовать в переменные типа bit.Этот фрагмент взят из документации MSDN для бита .

Строковые значения TRUE и FALSE могут быть преобразованы в битовые значения: TRUE преобразуется в 1, а FALSE преобразуется в 0.

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

Именно поэтому предложение where во втором фрагменте кода работает (я предполагаю, что поле определено как бит).

select * from table where field='true'

Без указания целевого типа бита, TRUE и FALSE больше не рассматриваются как специальные значения и остаются простыми строковыми значениями.Вот почему приведение было необходимо в вашем третьем фрагменте.

select cast('true' as bit) as somefield,...

MSDN сообщает , что битовые литералы (или константы, как они там упоминаются) - это числа 0 и 1.

битовые константы представлены числами 0 или 1 и не заключены в кавычки.Если используется число больше единицы, оно преобразуется в единицу.

В некоторых случаях эта информация может помочь, но помните, что литеральные значения 0 и 1 интерпретируются как числа, а не как биты.Следующие операторы оба возвращают int, что демонстрирует это.

select sql_variant_property(0, 'BaseType')
select sql_variant_property(1, 'BaseType')
6 голосов
/ 22 июня 2010

Sql Server не имеет логического типа данных, который вы можете сохранить в таблице, но он содержит битовый тип данных, который вы можете хранить.

Однако ключевое слово true, которое вы видите, является логическим значением,Sql Server использует только логический тип данных для результатов для своих операторов сравнения, которые могут возвращать три значения, TRUE, FALSE и UNKNOWN.

Важно знать различие между ними.

SELECT *
FROM Table
WHERE Field = 1 --Field = true

Чтобы сохранить логические значения в таблице, используйте битовый тип данных.Используйте 1 for true, 0 for false и Null for unknown.

4 голосов
/ 28 июня 2010

Я хочу добавить ко всем текущим ответам только еще один способ получить boolean без приведения в SQL Server:

DECLARE @myTrue bit = 1;
-- or two lines for old version of SQL Server
-- DECLARE @myTrue bit;
-- SET @myTrue = 1;

SELECT @myTrue AS somefield
3 голосов
/ 22 июня 2010

Используйте 1 или 0, предполагая, что ваше поле имеет тип бит.

select * from table where field=1

select * from table where field=0
1 голос
/ 20 ноября 2015

Не совсем ответ, но ...

Просто столкнулся с проблемой, когда я был вынужден использовать BIT-преобразование. Что ж, слово «принудительный» здесь является «немного» сильным ... Вместо этого я предпочел использовать BIT-преобразование.

Я построил SQL-запрос внутри метода c #, используя оператор case вроде:

case when foo = faa then 1 else 0 end as outcome

и когда результаты были переданы в запрос linq, результирующий тип был преобразован в INT32. Так что это не удалось:

outcome = s.Field<bool>("outcome")

Я хотел, чтобы результат преобразовался в BIT, поэтому вместо этого я использовал:

cast(case when foo = faa then 1 else 0 end as bit) as outcome

Суть в том, что, хотя TSQL может предполагать, что это бит, вместо ADO этого не произошло.

В целом, я думаю, я говорю, не полагайтесь на фреймворк (.NET или TSQL), чтобы выполнять грязную работу ... Если вы хотите BIT, приведите его как BIT:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...