Як передати ціле число на булеве значення в пункті 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)]
  • CHAR [(N)]
  • ДАТА
  • ДАТА, ЧАС
  • ДЕКІМАЛЬНІ [(M [, D])]
  • ПІДПИСАНО [ІНТЕГЕР]
  • ЧАС
  • НЕЗНАЧЕНО [ІНТЕГЕР]

Оскільки 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, то зробіть це

ВИБІРТЬ ІНФУЛЬНО (НЕ НЕ (що завгодно), ЛАЖНІ)


1
Цікаво, як це домагається перетворення цілого числа на булеве?
ypercubeᵀᴹ

2

Ви також можете використовувати "CASE":

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


Ви повинні подати його як булеве, якщо не це чарівне поле.
McNets

Іноді споживач вашого запиту хоче персонажа, хоча
Ерік Вілсон

2

Наразі це неможливо.

  • MySQL не має реального BOOLEANтипу (або реального типу масиву .. або реального типу JSON). Він має псевдонім для TINYINT.
  • Будь-яка умова повертає ціле число. Це найшвидший тип даних для процесора, і, мабуть, ця деталь реалізації відображена тут. Наприклад, '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: булева помилка ;

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.