it-swarm.asia

كيفية إرسال عدد صحيح إلى منطقي في عبارة 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 function:

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>

تعطي 0 أو 1 باستخدام عميل الخلية

المشكلة هي: CAST () = و CONVERT () يمكن فقط قبول وإعادة الأنواع التالية :

  • ثنائي [(N)]
  • CHAR [(N)]
  • تاريخ
  • DATETIME
  • DECIMAL [(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

يمكنك أيضًا تجربة الإكراه المنطقي الكلاسيكي:

لا تختار (لا) ؛

الشيء الجيد في هذا هو أنه يحافظ بشكل طبيعي على القيم الخالية ، في حين أن معظم الإجابات هنا لا تفعل ذلك.

إذا كنت تريد إجبار NULL على FALSE ، فقم بذلك

حدد IFNULL (ليس (أيًا كان) ، خطأ) ؛

5
poseidonCore

هذا مستحيل حاليا.

  • لا يحتوي MySQL على نوع BOOLEAN حقيقي (أو نوع صفيف حقيقي .. أو نوع JSON حقيقي). يحتوي على اسم مستعار لـ TINYINT.
  • تُرجع أي حالة عددًا صحيحًا. هذا هو أسرع نوع بيانات لوحدة معالجة مركزية ، ويفترض أن تفاصيل التنفيذ هذه تظهر هنا. على سبيل المثال، 'true' IS TRUE و 1=1 كلاهما العودة 1 كـ int.
  • لا يوفر CAST تنسيق TINYINT.

بقدر ما أستطيع أن أقول أنه لا يمكنك تخفيض رتبة ، ولا إنتاج معلومات صغيرة في SELECT.

أود بشدة أقترح الهجرة إلى PostgreSQL. إنه أقل رعبا بكثير ... ويحرر.

2
Evan Carroll

استخدم دالة الخلية CAST_TO_BIT

أمثلة:

SELECT CAST_TO_BIT(1);

Mysql: SELECT CAST_TO_BIT (0) ؛ -> برنامج تشغيل jdbc -> Java: منطقي خطأ ؛

Mysql: SELECT CAST_TO_BIT (1) ؛ -> برنامج تشغيل jdbc -> Java: منطقي صحيح ؛

Mysql: SELECT CAST_TO_BIT (NULL) ؛ -> برنامج تشغيل jdbc -> Java: NULL ؛

2
Dharmendrasinh Chudasama

يمكنك أيضًا استخدام "الحالة":

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 ، هناك دعم لنوع بيانات JSON الأصلي المحدد بواسطة RFC 7159. بالنسبة لحالة الاستخدام كان لدي عمود INT كان دائمًا إما 0 أو 1 ، لكنني كنت بحاجة إلى الإخراج على أنه منطقي true أو false ليست سلسلة "true" أو "false".

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

0
Aaron