تغيير WHERE لاختيار على صف واحد فقط اعتمادا على محتوى الحقل
-
22-08-2019 - |
سؤال
وطيب، وهذا قد يبدو غريبا بعض الشيء، ولكن ما عليك القيام به هو بسيط. لدي قائمة من الشركات وكل واحد له وصفا. الموقع في 4 لغات. مشكلتي عندما يأتي ولقد أدرجت الشركة في اللغة الإنجليزية ولكن الشخص الذي هو المسؤول عن ترجمتها باللغة الفرنسية ما زالت لم يجعل الترجمة، لذلك ليس لدي بسيط:
SELECT TOP(6)
company.name,
company.description,
company.address
WHERE
langid=1
ORDER BY
company.id DESC
والاستعلام الحقيقي هو أكثر تعقيدا، ولكن أعتقد أنه سيكون من الأسهل مع هذا واحد لفهم المشكلة. ما عليك القيام به هو، عندما وصف فارغ في LANGID 2 ثم تبين لي LANGID 1 كما LANGID 1 هو دائما أول واحد التي ستضاف. أنا لا أريد أن تظهر حقل الوصف فارغة.
وتخيل الصف 1، الصف 2، 3 الصف والصف 5 وصفا لLANGID 2 ولكن ليس صف 4 والصف 6. ولست بحاجة لإظهار LANGID 2 للصفوف التي تحتوي على ذلك، ولكن LANGID 1 للصفوف مع أي وصف.
وأنا أعلم أنني ربما يمكن أن تفعل فترة من الوقت مع تزايد حقلi وإدراج نتائج واحدا تلو الآخر في جدول مؤقت، ولكن هل هناك أي طريقة أفضل للقيام بذلك؟
المحلول
وهذا سيعمل ما لم يكن هناك lng1.name
الخ (أي اللغة الإنجليزية / البديل الإجراء الاحتياطي) في عداد المفقودين.
SELECT TOP(6)
COALESCE(lng2.name, lng1.name) [name],
COALESCE(lng2.description, lng1.description) description,
COALESCE(lng2.address , lng1.address ) address
FROM
company lng1
LEFT JOIN company lng2 ON
lng1.id = lng2.id AND
lng1.langid = 1 AND
lng2.langid = 2 /* your "foreign language" id, e.g. a parameter */
WHERE
lng1.id IN (1,2,3,4,5,6) /* or whatever */
ORDER BY
lng1.id DESC
وكذلك لن يحل محل العنوان بالكامل مع اللغة الإنجليزية / نسخة تراجع اذا سوى جزء من البديل المترجمة مفقود. سوف يتم استبدال فقط الأجزاء المفقودة.