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.
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 :
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 ...
Můžete to udělat velmi jednoduše, bez použití nadbytečného příkazu IF ():
... `YourField` IS NOT NULL AS `YourField` ...
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);
To je v současné době nemožné.
BOOLEAN
(nebo skutečný typ pole .. nebo skutečný typ JSON). Má alias pro TINYINT
.'true' IS TRUE
a 1=1
oba se vrátí 1
jako int
.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í.
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
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