سؤال

في الخلية هناك مقارنة مشغل فارغة آمنة:<=>.أنا استخدم هذا في برنامج جافا عند إنشاء البيانات المعدة مثل هذا:

String routerAddress = getSomeValue();
String sql = "SELECT * FROM ROUTERS WHERE ROUTER_ADDRESS <=> ? ";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, routerAddress);

الآن أود أن تتحول إلى H2 قاعدة البيانات الخاصة بنا.كيف يمكنني كتابة <=> مشغل في نقي SQL server (على سبيل المثال باستخدام باطل وليس NULL)?أود استخدام stmt.setString العملية فقط مرة واحدة.لا بأس أن يكتب اسم العمود عدة مرات.

ذات السؤال هو الحصول على null == null في SQL.ولكن هذا الجواب يتطلب البحث قيمة أن تكون مكتوبة 2 مرات (وهذا هو:2 علامات استفهام في PreparedStatement)!?

المرجع:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

هل كانت مفيدة؟

المحلول

ذات السؤال هو الحصول على null == null في SQL.ولكن هذا الجواب يتطلب البحث قيمة أن تكون مكتوبة 2 مرات (وهذا هو:2 علامات استفهام في PreparedStatement)!?

في المرتبة الثانية وما تلاها من الإجابات تعطي طريقة للقيام بذلك دون ربط قيمة البحث مرتين:

SELECT * FROM ROUTERS 
WHERE coalesce(ROUTER_ADDRESS, '') = coalesce( ?, '');

لاحظ أن هذا يتطلب دمية القيمة التي لا يمكن أبدا أن تكون صالحة قيمة العمود (هذا هو "من فرقة");أنا باستخدام سلسلة فارغة.وإذا لم يكن لديك أي من هذه القيمة ، سيكون لديك لطرح مع ربط قيمة مرتين:

SELECT * FROM ROUTERS 
WHERE ROUTER_ADDRESS = ? or (ROUTER_ADDRESS is null and ? is null);

نصائح أخرى

معيار NULL آمنة المساواة بين المشغلين في SQL IS DISTINCT FROM و IS NOT DISTINCT FROM.

في SQL, فارغة لا تساوي نفسها.بحيث يمكنك إما:

1 - استبدال دمية القيمة ومقارنة تلك ، كما في:

SELECT * FROM ROUTERS WHERE ISNULL(ROUTER_ADDRESS,'xxx') <=> ISNULL(?,'xxx')

أو

2 - استبدال ذلك مع أكثر تفصيلا المنطقي الاختبار, كما في:

SELECT *
FROM ROUTERS 
WHERE (
       (ROUTER_ADDRESS IS NULL AND ? IS NOT NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NOT NULL AND ROUTER_ADDRESS <> ?
      )

إذا كنت تريد الموجهات حيث ROUTER_ADDRESS باطل متى ؟ باطل ثم ربما هذا يمكن أن يعمل:

SELECT * 
FROM ROUTERS 
WHERE ROUTER_ADDRESS = (case when ROUTER_ADDRESS is null and ? is null then null 
                             else ? end)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top