استعلام SQL الذي يحل محل القيم الخالية.

StackOverflow https://stackoverflow.com/questions/206735

  •  03-07-2019
  •  | 
  •  

سؤال

أحتاج إلى استعلام SQL الذي يعيد ContactDate و SortName و City و ContactType وملخص من الجداول أدناه. إذا كانت أي قيمة لاغية ، فأنا بحاجة إليها لإرجاع النص "لا إدخال".

الاتصال

  • ContactId
  • ContactDate
  • معرف المستخدم
  • ملخص
  • نوع الاتصال
  • sortname

قابلية للتأثير

  • معرف المستخدم
  • الاسم الاول
  • الكنية
  • العنوان

قابل للعناوين

  • العنوان
  • مدينة
  • شارع
  • حالة
  • أَزِيز
هل كانت مفيدة؟

المحلول

SELECT COALESCE(CAST(CONVERT(VARCHAR(10), ContactTable.ContactDate, 101) AS VARCHAR(10)), 'No Entry') AS ContactDate,
       COALESCE(ContactTable.SortName, 'No Entry') AS SortName,
       COALESCE(AddressTable.City, 'No Entry') AS City,
       COALESCE(ContactTable.ContactType, 'No Entry') AS ContactType
FROM ContactTable
LEFT OUTER JOIN UserTable ON ContactTable.UserID = UserTable.UserID
LEFT OUTER JOIN AddressTable ON UserTable.AddressID = AddressTable.AddressID

هنا هو مخطط لتنسيقات DateTime SQL لبيان التحويل أعلاه.

نصائح أخرى

COALESCE () على أي منصة تستحق وزنها في الملح.

تأكد من التعامل مع مشكلات الصب.

مثل:

--(SQL Server)
SELECT
  C.ContactID,
  COALESCE(CAST(CONVERT(varchar(10), C.ContactDate, 101) AS varchar(10), 'No Entry') AS ContactDate,
  COALESCE(SorName, 'No Entry') AS SortName

إلخ ، إلخ.

SELECT 
  ISNULL(ContactDate, 'No Entry') AS ContactDate
FROM Table

استخدام isnull بسيط جدا.

يسمى إصدار Oracle من هذه الوظيفة nvl. نفس الاستخدام - SELECT nvl(col_name, desired_value) FROM foo.

النسخة الأكثر عمومية من هذا decode, ، التي تحتوي على ثلاثة معلمات وتتيح لك تحديد قيمة العمود التي تريد إجراء بديل لـ (حتى تتمكن من استبدال "Johnny" بـ "John" أو شيء من هذا القبيل).

استخدام 'IIF'هو حل الوصول إلى DB ولكنه قد يعمل في DBS الأخرى.

SELECT IIF(IsNull(Foo), 'No Entry' ,Foo), IIF(IsNull(Bar), 'No Entry' ,Bar) From TableName   

تُرجع الوظيفة IIF واحدة من قيمتين تعتمد على تقييم التعبير.
SQL Syntax: IIF (التعبير ، القيمة الحقيقية 1 ، القيمة الخاطئة)

يمكنك أيضًا إجراء مكالمات مختلفة لكل عمود. سيستغرق الأمر المزيد من المكالمات الفردية ، ولكن قد يكون الأمر أسرع إذا لم يكن لديك العديد من الصفوف التي يجب تحديثها.

update ContactTable
set ContactDate = 'No Entry'
where ContactDate is null;

كرر لكل عمود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top