MySQL SELECT yan tümcesinde bir boole tamsayısı nasıl kullanılır?


29

Ben burada yeniyim, bu yüzden bana kibar davran. Aşağıdaki senaryo var:

Basitlik adına, MySQL veritabanımdaki bir Görünümde temsil edilen birçok tablom var. Benim sorunum, bu görüşte, elde etmeye çalıştığım bir tür olay mı, yoksa başka bir (basit bir boole) olup olmadığını gösteren bir değere ihtiyacım olması:

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

Sonuç int olarak temsil edilir ve böylece Entity Framework tarafından okunur. Sorun şu ki, elde etmeye çalıştığım bir boole dönüş değerine ihtiyacım var:

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

Bu, MySQL Workbench'te bana gösterilmeyen bir hatayla sonuçlandı (Sadece "... içinde bir hatanız var" diye sinir bozucu oluyor).

Lütfen bana yardım eder misiniz?

Uygulamamda çözmeye çalıştım, ancak daha sonra başka bir yazılım tarafından kullanılacağı için veritabanında çözülmüş olanı gerçekten tercih ediyorum.

Yanıtlar:


26

IF işlevini kullanmayı deneyin :

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

veya

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

IF fonksiyonu olmasa bile

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

mysql>

MySQL istemcisini kullanarak 0 veya 1 verim

Sorun şudur: CAST () ve CONVERT () yalnızca aşağıdaki türleri kabul edip iade edebilir :

  • İKİLİ [(N)]
  • CHAR [(N)]
  • TARİH
  • DATETIME
  • Ondalık [(M [D])]
  • İMZALANDI [ENTEGER]
  • ZAMAN
  • İŞARETSİZ TAM SAYI]

BOOLEAN bu listede olmadığından, CAST veya CONVERT tarafından hiçbir zaman iade edilemez.

Dizeleri oluşturmak için IF işlevini kullanabilirsiniz

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

1
Bir boolean bir takma addır tinyint. Hiçbir koşulda bir IFgeri dönüş yapmaz , tinyintbu yüzden bu cevabın nasıl doğru veya kabul edilmiş olduğunu göremiyorum.
Evan Carroll,

@EvanCarroll Benim cevabım CAST ve CONVERT'in tamamen atlanması anlamına geliyor ... IF işlevinin kullanılması, çerçevesinin yapmayacağını yapıyor, bu da BOOLEAN'ı TINYINT (1-byte) yerine INT (4-byte) olarak tanıyor. Bu durumda, BOOLEAN değerleriyle çalışmamak için çerçeveyi suçladınız.
RolandoMySQLDBA

10

Gereksiz IF () ifadesini kullanmadan çok basit bir şekilde yapabilirsiniz:

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

Dürüst olmak gerekirse, bu en kolay yoldur. Ve davam için çalışıyor. Teşekkürler!
Mike Harrison,

4

Klasik boole zorlamasını da deneyebilirsiniz:

SELECT NOT NOT (ne olursa olsun);

Bu konuda iyi olan, NULL'ları doğal olarak koruduğu, buna karşın cevapların çoğu yok.

NULL’u FALSE’a zorlamak istiyorsanız, o zaman

IFNULL SEÇ (DEĞİL (DEĞİL), YANLIŞ);


1
Acaba, bu bir tamsayıyı boole dönüştürmeyi nasıl başarır?
ypercubeᵀᴹ

2

Ayrıca "CASE" kullanabilirsiniz:

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


Eğer bir char alanı değilse, onu boolean olarak kullanmalısınız.
McNets

Bazen sorgunuzun tüketicisi bir karakter istiyor olsa da,
Eric Wilson

2

Bu şu anda mümkün değil.

  • MySQL'in gerçek bir BOOLEANtürü (veya gerçek bir dizi türü .. veya gerçek bir JSON türü) yok. Bunun için bir takma adı var TINYINT.
  • Herhangi bir koşul bir tamsayı döndürür. Bu bir CPU için en hızlı veri türüdür ve bu uygulama detayı burada yansıtılmaktadır. Mesela, 'true' IS TRUEve 1=1her iki dönüş 1bir şekilde int.
  • CAST bir TINYINTformat sağlamaz .

Söyleyebileceğim kadarıyla ne bir tür indirgeyemezsiniz, ne de bir küçük tanecik üretemezsiniz SELECT.

PostgreSQL'e geçmeyi şiddetle tavsiye ederim . Çok daha az korkutucu ... ve özgürleştirici.


2

Mysql işlevini kullan CAST_TO_BIT

Örnekler:

SELECT CAST_TO_BIT(1);

MySQL: SELECT CAST_TO_BIT (0) ; -> jdbc sürücüsü -> Java: Boolean false ;

MySQL: SELECT CAST_TO_BIT (1) ; -> jdbc sürücüsü -> Java: Boolean true ;

MySQL: SELECT CAST_TO_BIT (NULL) ; -> jdbc sürücüsü -> Java: NULL ;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.