Ändern Sie die WHERE für eine ausgewählte auf nur eine Zeile je nach Feldinhalt
-
22-08-2019 - |
Frage
Ok, das mag ein wenig seltsam klingen, aber was muss ich tun ist einfach. Ich habe eine Liste von Unternehmen und jeder hat eine Beschreibung. Die Seite ist in 4 Sprachen. Mein Problem kommt, wenn ich ein Unternehmen in englischer Sprache aufgeführt haben, aber die Person, die verantwortlich ist davon in Französisch übersetzen immer noch nicht die Übersetzung gemacht hat, so habe ich eine einfache:
SELECT TOP(6)
company.name,
company.description,
company.address
WHERE
langid=1
ORDER BY
company.id DESC
Die eigentliche Abfrage ist komplexer, aber ich denke, es wird mit diesem ein leichter sein, das Problem zu verstehen. Was ich tun muß, ist, wenn die Beschreibung in langid 2 zeigt mir leer ist, dann der langid 1 als langid 1 immer der ersten ist, die hinzugefügt werden. Ich will nicht das Beschreibungsfeld leer zeigen.
Stellen Sie sich vor Zeile 1, Zeile 2, Zeile 3 und Zeile 5 eine Beschreibung für langid 2, aber nicht Zeile 4 und Zeile 6. Ich brauche langid 2 für die Zeilen zu zeigen, enthält es aber langid 1 für die Zeilen ohne Beschreibung.
Ich weiß, dass ich wohl noch eine Weile mit einem @i Feld Erhöhen und Einführen der Ergebnisse einer nach dem anderen in eine temporäre Tabelle tun könnte, aber gibt es einen besseren Weg, es zu tun?
Lösung
Das wird funktionieren, es sei denn, es ist lng1.name
usw. (das heißt die englische Sprache / Ausweichvariante) fehlt.
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
Es wird auch die gesamte Adresse mit der englischen / Ausweich Version nicht ersetzen, wenn nur ein Teil der lokalisierten Variante fehlt. Es werden nur die fehlenden Teile ersetzt werden.