Jak rzutować liczbę całkowitą na wartość logiczną w klauzuli MySQL SELECT?

29

Jestem tu nowy, więc bądź dla mnie miły. Mam następujący scenariusz:

Mam wiele tabel, które dla uproszczenia są reprezentowane w widoku w mojej bazie danych MySQL. Mój problem polega na tym, że potrzebuję wartości w tym widoku, która reprezentuje, czy jest to jedno lub drugie zdarzenie (zwykła wartość logiczna), które starałem się osiągnąć za pomocą:

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

Wynik jest reprezentowany jako int, a więc jest odczytywany przez Entity Framework. Problem polega na tym, że naprawdę potrzebuję logicznej wartości zwracanej, którą próbowałem osiągnąć za pomocą:

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

Spowodowało to błąd, który nie jest wyświetlany mi w MySQL Workbench (otrzymuję tylko irytujące „Masz błąd w ...”).

Czy możecie mi pomóc?

Próbowałem go rozwiązać w mojej aplikacji, ale naprawdę wolę to rozwiązane w bazie danych, ponieważ później będzie ono używane przez inne oprogramowanie.

Bruno
źródło

Odpowiedzi:

26

Spróbuj użyć funkcji JEŻELI:

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

lub

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

Działa nawet bez funkcji IF

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

mysql>

zwróć 0 lub 1 za pomocą klienta mysql

Problem w tym, że: CAST () i CONVERT () mogą akceptować i zwracać tylko następujące typy :

  • BINARY [(N)]
  • CHAR [(N)]
  • DATA
  • DATETIME
  • DECIMAL [(M [, D])]
  • PODPISANY [INTEGER]
  • CZAS
  • UNSIGNED [INTEGER]

Ponieważ BOOLEAN nie ma na tej liście, nigdy nie może zostać zwrócony przez CAST lub CONVERT

Możesz użyć funkcji JEŻELI do generowania łańcuchów

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 'TRUE', 'FALSE') 
FROM ...
RolandoMySQLDBA
źródło
1
Wartość logiczna to alias dla tinyint. Pod żadnym pozorem nie IFzwraca się, tinyintwięc nie widzę, jak ta odpowiedź jest poprawna lub zaakceptowana.
Evan Carroll,
@EvanCarroll Moja odpowiedź ma na celu całkowite ominięcie CAST i CONVERT .. Używanie funkcji JEŻELI robi to, czego nie zrobi jego framework, co oznacza rozpoznawanie BOOLEAN jako INT (4 bajty) zamiast TINYINT (1 bajt). W tym przypadku obwiniono platformę za brak pracy z wartościami BOOLEAN.
RolandoMySQLDBA,
10

Możesz to zrobić w bardzo prosty sposób, bez użycia zbędnej instrukcji IF ():

... `YourField` IS NOT NULL AS `YourField` ...
Roman Newaza
źródło
Szczerze mówiąc, jest to najłatwiejszy sposób. I działa w mojej sprawie. Dzięki!
Mike Harrison
4

Możesz także spróbować klasycznego przymusu boolowskiego:

NIE WYBIERAJ (cokolwiek);

Zaletą tego jest to, że naturalnie zachowuje wartości NULL, podczas gdy większość odpowiedzi tutaj nie.

Jeśli chcesz zmusić NULL do FAŁSZ, to zrób

WYBIERZ IFNULL (NIE NIE (cokolwiek), FAŁSZ);

poseidonCore
źródło
1
Zastanawiam się, jak to osiąga konwersję liczby całkowitej na wartość logiczną?
ypercubeᵀᴹ
2

Możesz także użyć „CASE”:

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

Zvezdochka
źródło
Powinieneś rzucić go na boolean, jeśli nie, to pole char.
McNets,
Czasami konsument twojego zapytania chce postaci
Eric Wilson
2

Jest to obecnie niemożliwe.

  • MySQL nie ma prawdziwego BOOLEANtypu (ani prawdziwego typu tablicy .. ani prawdziwego typu JSON). Ma alias dla TINYINT.
  • Każdy warunek zwraca liczbę całkowitą. Jest to najszybszy typ danych dla procesora i przypuszczalnie ten szczegół implementacji znajduje odzwierciedlenie tutaj. Na przykład, 'true' IS TRUEi 1=1zwracają 1jak azotan amonu int.
  • CAST nie zapewnia TINYINTformatu.

O ile mogę ci powiedzieć, nie możesz ani obniżyć typu, ani wyprodukować malutkiego w SELECT.

Chciałbym bardzo sugerować migracji do PostgreSQL. To o wiele mniej przerażające ... i wyzwalające.

Evan Carroll
źródło
2

Użyj funkcji mysql CAST_TO_BIT

Przykłady:

SELECT CAST_TO_BIT(1);

MySQL: SELECT CAST_TO_BIT (0) ; -> sterownik jdbc -> Java: Boolean false ;

MySQL: SELECT CAST_TO_BIT (1) ; -> sterownik jdbc -> Java: Boolean true ;

MySQL: SELECT CAST_TO_BIT (NULL) ; -> sterownik jdbc -> Java: NULL ;

Dharmendrasinh Chudasama
źródło