it-swarm.asia

إرجاع الصفر إذا لم يتم العثور على سجل

لدي استعلام داخل إجراء مخزن يلخص بعض القيم داخل جدول:

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;

بعد هذا التحديد ، أطرح res قيمة مع عدد صحيح تم استرجاعه بواسطة استعلام آخر وإرجاع النتيجة. إذا تم التحقق من WHERE فقرة ، كل شيء يعمل بشكل جيد. ولكن إذا لم يكن الأمر كذلك ، فكل ما قمت بإرجاعه هو عمود فارغ (ربما لأنني أحاول طرح عدد صحيح بقيمة فارغة).

كيف يمكنني جعل استعلامي بإرجاع صفر إذا كانت جملة WHERE غير راضية؟

30
giozh

يمكنك:

SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res;

يحدث هذا الأمر ، لأن الاستعلام الخاص بك يحتوي على وظيفة تجميعية وبالتالي دائمًا تُرجع صفًا ، حتى إذا لم يتم العثور على شيء في الجدول الأساسي.

ستُرجع الاستعلامات العادية بدون التجميع لا يوجد صف في مثل هذه الحالة. COALESCE لن يتم استدعاؤها ولن يتمكن من توفيرك. أثناء التعامل مع عمود واحد ، يمكننا تغليف الاستعلام بالكامل بدلاً من ذلك:

SELECT COALESCE( (SELECT columnA FROM my_table WHERE ID = 1), 0)
INTO res;

يعمل لاستعلامك الأصلي أيضًا:

SELECT COALESCE( (SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0)
INTO res;

المزيد عن COALESCE() في الدليل .
المزيد حول الوظائف الإجمالية في الدليل .
المزيد بدائل في هذا المنشور اللاحق:

57
Erwin Brandstetter

لست على دراية بـ postgresql ، ولكن في SQL Server أو Oracle ، فإن استخدام استعلام فرعي سيعمل كما هو موضح أدناه (في Oracle ، سيكون SELECT 0SELECT 0 FROM DUAL)

SELECT SUM(sub.value)
FROM
( 
  SELECT SUM(columnA) as value FROM my_table
  WHERE columnB = 1
  UNION
  SELECT 0 as value
) sub

ربما هذا من شأنه أن يعمل ل postgresql أيضا؟

3
Jim

يمكنك أيضًا تجربة ما يلي:

SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res;
0
Aamir Waheed