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>

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

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

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

BOOLEANはこのリストにないため、CASTまたはCONVERTによって返されることはありません

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

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

1
ブール値はのエイリアスですtinyint。状況がIFaを返すtinyintことはないので、この答えがどのように正しいか受け入れられるかはわかりません。
エヴァンキャロル

@EvanCarroll私の答えは、CASTとCONVERTを完全にバイパスすることです。IF関数を使用すると、彼のフレームワークでは実行されないことが行われます。この場合、ブール値を使用しないフレームワークのせいです。
RolandoMySQLDBA

10

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

... `YourField` IS NOT NULL AS `YourField` ...

正直なところ、これが最も簡単な方法です。そして私の場合はうまくいきます。ありがとう!
マイクハリソン

4

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

SELECT NOT NOT(何でも);

これの良い点は、NULLが自然に保持されるのに対し、ここでの回答のほとんどは保持しないことです。

NULLをFALSEに強制する場合は、

SELECT IFNULL(NOT NOT(何でも)、FALSE);


1
整数からブールへの変換をどのように達成するのでしょうか?
ypercubeᵀᴹ

2

「CASE」も使用できます。

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


charフィールドでない場合は、ブール値としてキャストする必要があります。
マクネッツ

時には、あなたのクエリの消費者は、しかし、文字を望んでいる
エリック・ウィルソン

2

これは現在不可能です。

  • MySQLには実際のBOOLEAN型(または実際の配列型..または実際のJSON型)はありません。のエイリアスがありTINYINTます。
  • どの条件でも整数が返されます。これはCPUの最速のデータ型であり、おそらくこの実装の詳細がここに反映されています。例えば、'true' IS TRUE1=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:ブール値false ;

MySQL: SELECT CAST_TO_BIT(1) ; -> jdbcドライバー-> Java:ブール値true ;

MySQL: SELECT CAST_TO_BIT(NULL) ; -> jdbcドライバー-> Java: NULL ;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.