it-swarm-eu.dev

Jak obsadit celé číslo do logického pole v klauzuli MySQL SELECT?

Jsem zde nový, tak ke mně buďte laskaví. Mám následující scénář:

Mám mnoho tabulek, které jsou kvůli jednoduchosti zastoupeny v pohledu v mé databázi MySQL. Můj problém je v tom, že v tomto pohledu potřebuji hodnotu představující, zda se jedná o jeden druh události (jednoduchý booleovský), kterého jsem se snažil dosáhnout:

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

Výsledek je vyjádřen jako int a čte ho Entity Framework. Problém je v tom, že opravdu potřebuji booleovskou návratovou hodnotu, kterou jsem se snažil dosáhnout pomocí:

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

To mělo za následek chybu, která se mi v MySQL Workbench nezobrazuje (dostávám pouze otravné „Máte chybu v ...“).

Můžete mi prosím pomoct?

Snažil jsem se to vyřešit v mé aplikaci, ale opravdu jsem to upřednostňoval vyřešený v databázi, protože bude později použit jiný software.

29
Bruno

Zkuste použít funkce IF:

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

nebo

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

I bez funkce IF běží

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

mysql>

výnos 0 nebo 1 pomocí mysql klienta

Problém je tento: CAST () = a CONVERT () může přijímat a vracet pouze následující typy :

  • BINARY [(N)]
  • CHAR [(N)]
  • DATUM
  • ČAS SCHŮZKY
  • DECIMAL [(M [ D])]
  • SIGNED [INTEGER]
  • ČAS
  • NEZAPISOVANÉ [INTEGER]

Protože BOOLEAN není v tomto seznamu, nemůže být nikdy vrácena CAST nebo CONVERT

Pomocí funkce IF můžete generovat řetězce

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

Můžete to udělat velmi jednoduše, bez použití nadbytečného příkazu IF ():

... `YourField` IS NOT NULL AS `YourField` ...
10
Roman Newaza

Můžete také vyzkoušet klasický booleovský nátlak:

VÝBĚR NENÍ NENÍ (cokoli);

Dobré na tom je, že přirozeně zachovává NULL, zatímco většina odpovědí zde ne.

Pokud chcete donutit NULL k FALSE, udělejte to

VÝBĚR IFNULL (NOT NOT (any), FALSE);

5
poseidonCore

To je v současné době nemožné.

  • MySQL nemá skutečný typ BOOLEAN (nebo skutečný typ pole .. nebo skutečný typ JSON). Má alias pro TINYINT.
  • Každá podmínka vrací celé číslo. Toto je nejrychlejší datový typ pro CPU a pravděpodobně se zde odráží i tento detail implementace. Například, 'true' IS TRUE a 1=1 oba se vrátí 1 jako int.
  • CAST neposkytuje formát TINYINT.

Pokud vám mohu říci, nemůžete ani degradovat typ, ani produkovat drobounku v SELECT.

Doporučil bych vysoce navrhnout přechod na PostgreSQL. Je to mnohem méně děsivé ... a osvobozující.

2
Evan Carroll

Použijte funkci mysql CAST_TO_BIT

Příklady:

SELECT CAST_TO_BIT(1);

Mysql: VYBRAT CAST_TO_BIT (0); -> ovladač jdbc -> Java: - boolean false;

Mysql: VYBRAT CAST_TO_BIT (1); -> ovladač jdbc -> Java: - boolean true;

Mysql: VYBRAT CAST_TO_BIT (NULL); -> ovladač jdbc -> Java: NULL ;

Můžete také použít „PŘÍPAD“:

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

2
Zvezdochka

CAST(IF(col_name = 1, 'true', 'false') AS JSON) může v některých případech použití fungovat.

Od MySQL 5.7.8 existuje podpora nativního datového typu JSON definovaného RFC 7159. Pro můj případ použití jsem měl sloupec INT, který byl vždy buď 0 nebo 1, ale výstup jsem potřeboval jako bool true nebo false není řetězec „true“ nebo „false“.

https://dev.mysql.com/doc/refman/5.7/en/json.html#json-converting-between-types

0
Aaron