9 Stimmen

MySQL: wie man COALESCE verwendet

Sagen wir, ich habe die folgende Tabelle:

TABELLE: Produkt
===============================================================================
| produkt_id | sprach_id | name           | beschreibung                    |
===============================================================================
| 1          | 1           | Widget 1       | Wirklich schönes Widget. Jetzt kaufen! |
-------------------------------------------------------------------------------
| 1          | 2           | Lorem  1       |                                 |
-------------------------------------------------------------------------------

Wie frage ich das ab, so dass es mir den name und beschreibung zurückgibt, wo sprach_id = 2 ist, aber auf sprach_id = 1 zurückfällt, wenn die Spalte NULL enthält?

In obigem Beispiel sollte ich Lorem 1 für name und Wirklich schönes Widget. Jetzt kaufen! für beschreibung erhalten.

8voto

Francisco Alvarado Punkte 2807

Wie wäre es damit?

SET @pid := 1, @lid := 2;
SELECT 
    COALESCE(name,(
        SELECT name
        FROM product
        WHERE product_id = @pid AND description IS NOT NULL
        LIMIT 1
    )) name, 
    COALESCE(description,(
        SELECT description
        FROM product
        WHERE product_id = @pid AND description IS NOT NULL
        LIMIT 1
    )) description
FROM product
WHERE product_id = @pid 
    AND (language_id = @lid 
    OR language_id = 1)
ORDER BY language_id DESC
LIMIT 1;

wo:

  • @pid: aktuelle Produkt-ID
  • @lid: aktuelle Sprach-ID
  • Werte für name und/oder description könnten null sein
  • language_id = 2 Element könnte nicht existieren

1voto

Richard Schneider Punkte 34159
auswählen name, beschreibung aus produkt
wo produkt_id = @pid
  und name ist nicht null
  und beschreibung ist nicht null
  und (language_id = @lang oder language_id = 1)
nach language_id desc sortieren

wo @pid die aktuelle Produkt-ID und @lang die aktuelle Sprach-ID ist.

Die erste zurückgegebene Zeile enthält den aktuellen Namen und die Beschreibung.

Dies setzt voraus, dass die Zeile language_id = 1 NICHT NULL in Name oder Beschreibung enthält.

0voto

Ronnis Punkte 12252
select p2.product_id
      ,coalesce(p2.name, p1.name, 'Kein Name') as name
      ,coalesce(p2.description, p1.description, 'Keine Beschreibung') as description
  from product p2
  left join product p1 on(
       p1.product_id = p2.product_id
   and p1.language_id = 1
  )
 where p2.product_id  = 1
   and p2.language_id = 2;

Bearbeiten 1:
Die obige Abfrage setzt voraus, dass die Zeile mit language=2 existiert, aber der Name/Beschreibung möglicherweise null ist.

Bearbeiten 2:
Ich erinnere mich gerade, dass vor Kurzem jemand eine ähnliche Frage gestellt hat. Und dann habe ich entdeckt, dass du es warst. Du musst die Produkte von den Übersetzungen trennen. Das ist es, was es schwierig macht, diese Abfrage zu schreiben. Die Antwort von Thomas macht es einfach, das zu tun, was du möchtest.

0voto

user2034889 Punkte 1

Annahme: Es gibt einen Eintrag für jedes Produkt mit language = 1 Das folgende Codebeispiel ist einfach SQL, um das Gewünschte abzurufen.

Ein weiteres Thema ist, ob Sie das gewünschte Verhalten möchten.. Denn Sie können gemischte Sprachen zwischen name und description haben. Ich würde es anders gestalten, wenn eines der beiden Felder leer ist, würde ich auf die Hauptsprache (1) zurückgreifen.

select p.product_id,
  coalesce(pl.name, p.name, 'Kein Name') as name,
  coalesce(pl.description, p.description, 'Keine Beschreibung') as description
from product p
  left join product pl on (pl.product_id = p.product_id and pl.language_id = :language_id)
where p.product_id = :product_id and p.language_id = 1

0voto

Chand Priyankara Punkte 6576

Hier ist ein Beispiel für die Verwendung von SQL Update:

Es ist äquivalent zu Oracles NVL. Sie können es wie unten in einer vorbereiteten Anweisung mit Parametern verwenden

UPDATE
    tbl_cccustomerinfo
SET
    customerAddress = COALESCE(?,customerAddress),
    customerName =  COALESCE(?,customerName),
    description =  COALESCE(?,description)
WHERE
    contactNumber=?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X