Как привести целое число к логическому значению в предложении MySQL SELECT?

29

Я новичок здесь, так что будь добр ко мне. У меня есть следующий сценарий:

У меня есть много таблиц, которые для простоты представлены в виде в моей базе данных MySQL. Моя проблема в том, что мне нужно значение в этом представлении, представляющее, является ли это тем или иным видом события (простым логическим значением), которого я пытался достичь с помощью:

`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement` AS `IsStopingEvent`

Результат представляется как int, и поэтому читается Entity Framework. Проблема в том, что мне действительно нужно логическое возвращаемое значение, которого я пытался достичь с помощью:

CAST((`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement`) as boolean) AS `IsStopingEvent` 

Это привело к ошибке, которая не отображается мне в MySQL Workbench (я получаю только раздражающее сообщение «У вас ошибка в ...»).

Ребята, вы можете мне помочь?

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

Bruno
источник

Ответы:

26

Попробуйте использовать функцию IF:

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, TRUE, FALSE) 
FROM ...

или

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 1, 0) 
FROM ...

Даже без функции IF, работает

mysql> select ('rolando' = 'rolando') str_compare;
+-------------+
| str_compare |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql>

выведите 0 или 1, используя клиент MySQL

Проблема заключается в следующем: CAST () и CONVERT () могут принимать и возвращать только следующие типы :

  • БИНАРНЫЙ [(N)],
  • СИМ [(N)],
  • СВИДАНИЕ
  • DATETIME
  • ДЕСЯТИЧНАЯ [(М [, D])]
  • ПОДПИСАНО [INTEGER]
  • ВРЕМЯ
  • НЕ ПОДПИСАНО [INTEGER]

Поскольку BOOLEAN нет в этом списке, он никогда не может быть возвращен CAST или CONVERT

Вы можете использовать функцию IF для генерации строк

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 'TRUE', 'FALSE') 
FROM ...
RolandoMySQLDBA
источник
1
Булево является псевдонимом для tinyint. Ни при каких обстоятельствах не IFвозвращает, tinyintтак что я не вижу, насколько этот ответ является правильным или принятым.
Эван Кэрролл
@EvanCarroll Мой ответ предназначен для полного обхода CAST и CONVERT. Использование функции IF делает то, чего не делает его фреймворк, то есть распознает BOOLEAN как INT (4-байтовый), а не TINYINT (1-байтовый). В этом случае вы обвиняете платформу в том, что она не работает со значениями BOOLEAN.
RolandoMySQLDBA
10

Вы можете сделать это очень простым способом, без использования избыточного оператора IF ():

... `YourField` IS NOT NULL AS `YourField` ...
Роман Ньюаза
источник
Честно говоря, это самый простой способ. И работает для моего случая. Благодарность!
Майк Харрисон
4

Вы также можете попробовать классическое логическое принуждение:

ВЫБРАТЬ НЕ НЕ (что угодно);

Хорошая вещь об этом - то, что это естественно сохраняет NULL, тогда как большинство ответов здесь не делает.

Если вы хотите принудительно установить NULL в FALSE, тогда

ВЫБЕРИТЕ IFNULL (НЕ НЕТ (как угодно), ЛОЖЬ);

poseidonCore
источник
1
Интересно, как это позволяет преобразовать целое число в логическое значение?
ypercubeᵀᴹ
2

Вы также можете использовать «CASE»:

SELECT CASE WHEN yourField=testValue THEN 'TRUE' ELSE 'FALSE' END as boolFieldName

Звездочка
источник
Вы должны использовать его как логическое значение, если нет, то это поле типа char.
McNets
Иногда потребитель вашего запроса хочет персонажа, хотя
Эрик Уилсон
2

В настоящее время это невозможно.

  • MySQL не имеет реального BOOLEANтипа (или реального типа массива .. или реального типа JSON). У него есть псевдоним для TINYINT.
  • Любое условие возвращает целое число. Это самый быстрый тип данных для CPU, и, вероятно, эта деталь реализации отражена здесь. Например, 'true' IS TRUEи 1=1оба возвращаются 1как int.
  • CAST не предоставляет TINYINTформат.

Насколько я могу сказать, вы не можете ни понизить тип, ни произвести миниатюрный тип в SELECT.

Я настоятельно рекомендую перейти на PostgreSQL. Это гораздо менее страшно ... и освобождает.

Эван Кэрролл
источник
2

Используйте функцию mysql CAST_TO_BIT

Примеры:

SELECT CAST_TO_BIT(1);

Mysql: SELECT CAST_TO_BIT (0) ; -> драйвер jdbc -> Java: логическое значение false ;

Mysql: SELECT CAST_TO_BIT (1) ; -> драйвер jdbc -> Java: логическое значение true ;

Mysql: SELECT CAST_TO_BIT (NULL) ; -> драйвер jdbc -> Java: NULL ;

Дхармендрасинх Чудасама
источник