2016-04-15 8 views
-1

Hier sind meine Tabellen:Fall bei der Rückkehr null Reihe

T1: 
ID 
1 
2 
3 

T2: 
ID (fk) value 
1  Apple 
1  Chocolate 
2  Carrot 
2  Chocolate 
3  Candy 
3  Chocolate 

In meiner Anfrage:

select t1.id, 
case when (t2.a) like 'app%' 
    then 'Apple' 
end as 'Fruits', 
case when (t2.a) like 'car%' 
    then 'Carrot' 
end as 'Veggies' 
from t1, t2 
where t1.id = t2.id 

hier ist, wie meine Ausgabe lautet:

id Fruits Veggies 
===================== 
1 Apple 
1 
2   Carrot 
2 
3 

Ich sehe, dass in der Ausgabe, ich bekomme zwei Zeilen, eine mit einem Match 'Obst'/'Veggie' und eine mit null. Warum gibt die Abfrage auch eine Nullzeile zurück? Sorry, wenn mein Beispiel nicht so toll ist. Grundsätzlich versuche ich zwei weitere Spalten mit einigen Textbezeichnern zu erstellen.

Ich erwarte eine Ausgabe wie:

id Fruits Veggies 
    ===================== 
1 Apple 
2   Carrot 
3 

EDIT: Ich habe die Tabellenstruktur oben und aktualisiert die Abfrage mit aus und wo Klauseln hinzugefügt. Nach der Implementierung der Bedingung in der WHERE-Klausel erkannte ich, dass die IDs ohne Apple oder Carrot wie # 3 überhaupt nicht zurückgegeben werden, wenn ich die Bedingung in der Where-Klausel habe.

+2

Veröffentlichen Sie Ihre gesamte Abfrage; Sie scheinen die From-Klausel zu verpassen; Auch wenn Sie Ihre Tabelle und einige Beispieldaten posten könnten, wäre es hilfreich. – Kateract

+0

Warum ignorierst du Kateracts Kommentar? Ihnen wird gesagt, dass Sie den Teil der Abfrage nicht anzeigen, der entscheidet, welche Zeilen in Ihrem Ergebnis angezeigt werden. Aber anstatt die FROM- und WHERE-Klausel hinzuzufügen, ändern Sie Ihre Frage, indem Sie plötzlich die ID 3 eingeben. Das hat wiederum nichts mit dem Teil der Anfrage zu tun, den Sie zeigen, sondern noch einmal mit dem Teil, den Sie * nicht * zeigen. –

+0

sieht aus, als hätten Sie einen schlechten JOIN, die Tatsache, dass id doppelt ist, bedeutet, dass Sie möglicherweise eine Bedingung auf Ihrem JOIN verpassen. –

Antwort

1

Hinweis: Ich habe die Frage ursprünglich falsch interpretiert und angenommen, dass Sie versuchen, die Nullwerte neben den gefundenen Werten in den Zeilen zu ersetzen, die zu einem Ergebnis geführt haben. Deshalb habe ich vorgeschlagen, ein ELSE einzuschließen. Ich habe das Beispiel geändert, um den Filter in eine WHERE-Klausel aufzunehmen, damit Sie keine Zeilen erhalten, die weder app% noch auto% haben.

Beispiel:

select t1.id, 
case when (t1.a) like 'app%' then 'Apple' 
end as 'Fruits' 
case when (t1.a) like 'car%' then 'Carrot' 
end as 'Veggies' 
where t1.a like 'app%' or t1.a like 'car%' 
+0

Das ist, was ich vermutete, könnte passieren! Wie kann dies so geschrieben werden, dass es keine Nullen zurückgibt? Ich möchte nur den Text ausgefüllt werden, wenn es eine Übereinstimmung für 1 ID gibt. Wenn keine Übereinstimmung vorhanden ist, kann sie für diese Zeile null sein. – Skn

+0

Sie wollen also, dass die Zeile nicht erscheint, wenn es keine Übereinstimmung für "Apple" oder "Karotte" gibt, weil es im Grunde nur eine leere Zeile wäre. – Dresden

+0

Ich erwarte nur 1 Übereinstimmung pro ID, also erwarte ich nur 1 Zeile pro ID entweder mit oder ohne Übereinstimmung. – Skn

0

Du Ergebniszeilen immer wollen Sie nicht. Ausschließen sie in Ihrem WHERE Klausel:

where t1.a like 'app%' or t1.a like 'car%' 

UPDATE: Sie haben Ihre Frage aktualisiert und wollen eine ID 3 zeigen, die nicht in den Ergebnissen ist. Trotzdem zeigen Sie Ihre FROM- und WHERE-Klausel nicht an. Wenn eine Zeile angezeigt werden soll, die Sie aber noch nicht anzeigen, ist entweder Ihre vorhandene WHERE-Klausel zu restriktiv oder Sie verwenden eine innere Verknüpfung, für die Sie eine äußere Verknüpfung wünschen.

UPDATE2: Jetzt, wo Sie Ihre Anfrage erneut aktualisiert Tabellenstruktur zeigt und Inhalt, zeigt es, dass Sie zwei Abfrageergebnisse tatsächlich: Die Äpfel und Karotten (dies ist eine Nicht-Aggregation-Abfrage) sowie ein Datensatz für jeden ID, die weder das eine noch das andere hat (was ein Aggregat ist; Sie sehen sich alle ID-Datensätze an, um festzustellen, ob die Bedingung wahr ist oder nicht). Sie würden diese zwei Abfragen zusammen mit UNION ALL kleben.

select 
    t2.id, 
    case when t2.a like 'App%' then 'Apple' end as "Fruits", 
    case when t2.a like 'Car%' then 'Carrot' end as "Veggies" 
from t2 
join t1 on t1.id = t2.id 
where t2.a like 'App%' or t2.a like 'Car%' 
union all 
select id, null, null 
from t2 
group by id 
having max(case when a like 'App%' or a like 'Car%' then 1 else 0 end) = 0; 

Bemerkungen:

  • Tabelle t1 nicht wirklich in dieser Abfrage benötigt wird, aber ich denke, es ist in Ihrer realen Abfrage ist, also hielt ich es in
  • Ihre Join-Syntax ist außerhalb. älter als zwanzig Jahre und sollte nicht mehr verwendet werden. Ich habe es durch einen richtigen expliziten Join ersetzt.
  • Das einfache Anführungszeichen ist für Zeichenfolgenliterale. Verwenden Sie stattdessen doppelte Anführungszeichen für Alias-Namen.
  • Oracle ist in der Regel Groß-und Kleinschreibung.Ich bin überrascht, like 'app%' arbeitet für Sie. Es sollte t2.a like 'App%' oder lower(t2.a) like 'app%' meiner Meinung nach sein.
+0

danke! Ich denke, ich muss die Bedingung zu meiner Where-Klausel hinzufügen. Ich habe die vollständige Abfrage nicht gepostet, weil ich den Eindruck hatte, dass die case-Anweisung das Problem hat, weil ich die else weggelassen habe. – Skn

0

Angesichts Ihrer aktualisierten Informationen benötigen Sie eine linke Verbindung statt einer inneren Verbindung.

select t1.id, 
case when (t2.a) like 'app%' then 'Apple' end as 'Fruits', 
case when (t2.a) like 'car%' then 'Carrot' end as 'Veggies' 
from t1 left join t2 
on t1.id = t2.id 
    and (t2.a like 'app%' or t2.a like 'car%') 

Dies wird alle 3-IDs erlauben zu zeigen, aber Sie werden nur die Zeilen geben, wo ein Apfel oder eine Karotte auf der rechten Tabelle gibt es, wie die in dem Zustand der Verbindung bewegt wird.