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


29

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

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

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

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

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

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

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

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

Ответы:


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 ...

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 (НЕ НЕТ (как угодно), ЛОЖЬ);


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 ;

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.