web-dev-qa-db-ja.com

MySQLのSELECT句で整数をブール値にキャストする方法は?

私はここに新しいので、親切にしてください。次のシナリオがあります。

簡単にするために、MySQLデータベースのビューに表されている多くのテーブルがあります。私の問題は、このビューで、ある種類のイベントか別のイベント(単純なブール値)かを表す値が必要なことです。

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

結果はintとして表されるため、Entity Frameworkによって読み取られます。問題は、ブール値の戻り値が本当に必要であることです。

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

これにより、MySQL Workbenchに表示されないエラーが発生しました(「...にエラーがあります...」と表示されるだけです)。

助けてくれませんか?

私のアプリケーションでそれを解決しようとしましたが、後で他のソフトウェアで使用されるので、データベースで解決するのが本当に好ましいです。

29
Bruno

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>

mysqlクライアントを使用して0または1を生成する

問題はこれです:CAST() =および CONVERT()は、次のタイプのみを受け入れて返すことができます

  • BINARY [(N)]
  • CHAR [(N)]
  • 日付
  • 日付時刻
  • 10進数[(M [、D])]
  • 署名済み[整数]
  • 時間
  • 符号なし[整数]

BOOLEANはこのリストにないため、CASTまたはCONVERTから返すことはできません

IF関数を使用して文字列を生成できます

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

冗長なIF()ステートメントを使用せずに、非常に簡単な方法で実行できます。

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

また、古典的なブール型強制を試すこともできます。

SELECT NOT NOT(whatever);

これの良い点は、それがNULLを自然に保存することですが、ここでの答えのほとんどは保存しません。

NULLをFALSEに強制したい場合は、

SELECT IFNULL(NOT NOT(whatever)、FALSE);

5
poseidonCore

これは現在不可能です。

  • MySQLには実際のBOOLEANタイプ(または実際の配列タイプ..または実際のJSONタイプ)はありません。 TINYINTのエイリアスがあります。
  • どの条件でも整数を返します。これはCPUの最速のデータ型であり、おそらくこの実装の詳細がここに反映されています。たとえば、'true' IS TRUE1=1はどちらも1intとして返します。
  • CASTはTINYINT形式を提供しません。

私が知る限り、型を降格することも、SELECTでtinyintを生成することもできません。

非常に PostgreSQLへの移行を提案します。それはそれほど恐ろしいことではありません...そして解放されます。

2
Evan Carroll

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 [〜#〜];

「CASE」も使用できます。

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

2
Zvezdochka

CAST(IF(col_name = 1, 'true', 'false') AS JSON)は、一部のユースケースで機能する場合があります。

MySQL 5.7.8以降では、RFC 7159で定義されているネイティブJSONデータ型がサポートされています。私のユースケースでは、常に0または1のINT列がありましたが、出力はbool trueまたはfalseではなく、文字列 "正しいか間違っているか"。

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

0
Aaron