2017-01-24 3 views
0

Ich versuche, eine einfache, IF, ELSE IF, ELSE-Anweisung, die ziemlich einfach in SQL. aus irgendeinem Grund wird es mir in MySQL nicht zuhören. Es hält mich zu sagen ‚das verdammte Handbuch lesen‘ altho das Handbuch: https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.htmlMySQL Abfrage IF EXISTEN ELSE IF ELSE

geht nicht hervor, wie dies in dem SELECT-Teil zu tun, erst nach dem, wo, was ich Mittel annehmen, würde ich dies die Art und Weise nicht tun kann, ich bin verwendet, um dies zu tun. Die verbleibende Frage ist, wie würde ich es dann tun?

SELECT EXISTS(SELECT 1 FROM `content` WHERE `ResourceKey`='Test' AND `Language`='en-GB') 
THEN 
    SELECT `Text` FROM `content` WHERE `ResourceKey`='Test' AND `Language`='en-GB'; 
ELSE 
    SELECT `Text` FROM `content` WHERE `ResourceKey`='Test' AND `Language`='nl-NL'; 
END IF; 

auch einige Infos:

Innodb version: 1.1.8 Protocol version: 10

Antwort

1

Wenn Sie einen Datensatz aus der Abfrage erwarten, dann gibt es keine Notwendigkeit, eine IF ELSE Erklärung dafür zu verwenden. Versuchen Sie stattdessen:

SELECT `Text` 
FROM `content` 
WHERE `ResourceKey`='Test' AND `Language` ΙΝ ('en-GB', 'nl-NL'); 
ORDER BY CASE 
      WHEN `Language` = 'en-GB' THEN 1 
      ELSE 2 
     END 
LIMIT 1 

Falls Sie zu immer einen Text zurückkehren, auch wenn kein Datensatz zurückgegeben wird, dann verwenden:

SELECT COALESCE(t2.Text, 'No record found') AS Text 
FROM (
    SELECT 'en-GB' AS lang UNION ALL 'nl-NL' UNION ALL 'no-lang') AS t1 
LEFT JOIN content AS t2 
    ON t1.lang = t2.Language AND t2.ResourceKey = 'Test' 
ORDER BY CASE 
      WHEN t1.lang = 'en-GB' THEN 1 
      WHEN t1.lang = 'nl-NL' THEN 2 
      ELSE 3   -- This is the case where t1.lang = 'no-lang' 
     END 
LIMIT 1 

Ich gehe davon aus es keine Aufzeichnungen in Ihrer Datenbank mit Language = 'no-lang'.

+0

Hmm das ist viel sexier als ich erwartet hatte, und ja, sollte es nur 1 zurück ('ResourceKey' + language = unique) auf Erweiterung der Funktion, wie würde ich einen einfachen Text zurück, wenn weder wurde gefunden, ? –

+0

Auch IN wird nicht in meiner Datenbank unterstützt. –

+0

@JpHouten Bitte überprüfen Sie die Änderung, die ich gemacht habe. –

0
SELECT `Text` 
FROM `content` 
WHERE `ResourceKey` = 'Test' 
AND `Language` ΙΝ ('en-GB', 'nl-NL') 
ORDER BY if (`Language` = 'en-GB', 1, 2) 
LIMIT 1 
+1

Während dieser Code-Schnipsel, die Frage lösen kann, [einschließlich einer Erläuterung] (/ /meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) hilft wirklich, die Qualität Ihrer Post zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! – FrankerZ

+0

Manchmal ist es schwer zu erklären, warum 1 + 1 = 2 nicht 3 :) – SIDU

+0

Ich habe @giorgos seine Antwort akzeptiert, weil seine Erklärung explizit war und IN nicht auf meiner Version von MySQL funktioniert. –