2016-07-20 14 views
1

Ich habe die folgende Abfrage:Ersetzen Sie leere und Null-Werte in SQL

Select 
    impressions, 
    COALESCE(u.company,u.email) AS Publisher 
FROM users AS u 

Hier hat das Unternehmen Feld hat einen Firmennamen oder eine Null oder einen Nullwert. Ich möchte nicht, dass die Publisher-Spalte einen leeren Wert oder einen Nullwert enthält.

Die obige Anweisung funktioniert für NULL, da sie in diesem Fall den Wert von u.email zurückgibt. Aber es funktioniert nicht für leere Werte. So versuchte ich es:

Dies scheint nicht zu funktionieren, da leere Werte nicht per E-Mail ersetzt werden.

Kann jemand bitte darauf hinweisen, wo ich falsch liege? Gibt es eine Alternative?

+0

Es ist hässlicher ... aber dann, wenn u.company ist null u.email dann, wenn trim (u.company) = ‚‘ dann u.email sonst u.company Ende – Twelfth

+0

Was Datentyp ist "u.company"? –

+0

@ AaronD- u.company ist varchar (256) – Cerberus

Antwort

1

vielleicht dies:

COALESCE(NULLIF(u.company,u.email),u.email) 
+0

Aber wird es u.company und u.email in diesem Fall nicht vergleichen? Ich versuche, null und leere Werte im Firmenfeld loszuwerden und sie durch email zu ersetzen. – Cerberus

1

Wenn ich verstehe, was Sie richtig sagen.

COALESCE wertet die Argumente um und gibt den aktuellen Wert des ersten Ausdrücke, die zunächst nicht auf NULL nicht auswertet.

Dies scheint der Grund zu sein, warum Ihre Anweisung für NULL funktioniert. In dem Fall funktioniert es nicht für leere Werte, weil ein leerer Wert technisch immer noch ein Wert ist, wenn er als String ausgewertet wird.

Auch, wenn Sie auf die Datenbanktabelle beziehen sich nicht null oder Leerwert aufweisen kann man einen Tisch setzen können, um nicht einen Nullwert zu akzeptieren:

ALERT TABLE [Tabellenname] ALTER COLUMN [ Spalte] INTEGER NOT NULL

Integer wäre natürlich, wenn sie nicht dieser Typ ersetzt werden. Dies kann zu Problemen in Code führen, der mit der Datenbank kommuniziert, wenn er nicht ordnungsgemäß geschrieben wurde, um Nullwerte zu verarbeiten, die an eine Datenbank gesendet werden.

Um Wert in einer bestimmten Spalte mit Werten zu ersetzen, die in einer anderen Spalte wie Ersetzen Unternehmenswerte mit E-Mail-Werten könnten Sie versuchen.

UPDATE [table name] t 
SET t.[column name] = 
(SELECT [other column name from table2] FROM [table2 name] v 
WHERE t.[column name] = v.[column name from table2]); 
+0

Sie sind richtig, aber gibt es keine Möglichkeit, die Leer- und Nullwerte in der Unternehmensspalte durch E-Mails zu ersetzen? – Cerberus

1

Dies ist ein bisschen schmutziger, aber es wird funktionieren. Definieren Sie einfach jeden Fall, den Sie ersetzen möchten, in einer case-Anweisung (verwenden Sie trim, falls jemand 2 oder 3 Leerzeichen eingibt). Wahrscheinlich nicht die optimale Lösung, wenn

case when u.company is null then u.email 
    when trim(u.company) = '' then u.email 
else u.company 
end 
+0

Vielleicht nicht optimal, aber das macht Sinn !! – Cerberus