2017-07-19 7 views
0

Ich versuche, das Feld einer XML-Datei entweder mit "0" zu füllen, wenn eine bestimmte Spalte (pv_an4) nicht existiert, ODER mit dem Wert der Spalte, wenn es existiert. so weitFall, wenn existiert - Spalte (SQL)

Dies ist mein Code:

XMLELEMENT(Name "Telephone", 
case 
when not exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then '' 
when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then pv_an4 
end), 

Als ich dies ausführen bekomme ich diesen Fehler:

FEHLER: Column »pv_an4« does not exist ZEILE 25: ...E_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then pv_an4

Aber das macht für mich keinen Sinn machen, denn zum Beispiel mit diesem Code es würde funktionieren:

Ich habe den ganzen Tag versucht, dieses Problem zu lösen, könnte jemand mich in der richtigen Richtung Richtung, bitte?

/edit: Volle Abfrage rechts unten:

SELECT 
XMLFOREST(xmlpb.entry as "DivinusIPPhoneDirectory") 
FROM (
SELECT 
XMLCONCAT (
XMLELEMENT (NAME "Title", 'Phonelist'), 
XMLELEMENT (NAME "Prompt", 'Prompt'), 
XMLAGG (
XMLELEMENT (
NAME "DirectoryEntry", 
XMLELEMENT(Name "Name", 
case 
when (pb.company = '') IS FALSE AND pb.lastname != '' and pb.firstname != '' then pb.company || ' - ' || pb.lastname || ', ' || pb.firstname 
when (pb.company = '') IS FALSE AND pb.lastname != '' and pb.firstname = '' then pb.company || ' - ' || pb.lastname 
when (pb.company = '') IS FALSE AND pb.lastname = '' and pb.firstname = '' then pb.company 
when (pb.company = '') IS FALSE AND pb.lastname = '' and pb.firstname != '' then pb.company || ' - ' || pb.firstname 
when (pb.company = '') IS NOT FALSE AND pb.lastname != '' and pb.firstname != '' then pb.lastname || ', ' || pb.firstname 
when (pb.company = '') IS NOT FALSE AND pb.lastname != '' and pb.firstname = '' then pb.lastname 
end), 
XMLELEMENT(Name "Telephone", pb.pv_an3), 
XMLELEMENT(Name "Telephone", 
case 
when not exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then '' 
else pb.pv_an4 
end), 
XMLELEMENT(Name "Telephone", pb.phonenumber), 
XMLELEMENT(Name "Telephone", pb.pv_an1), 
XMLELEMENT(Name "Telephone", pb.pv_an2) 
) 
) 
) as entry 
FROM 
phonebook pb 
WHERE fkidtenant = 1 

Antwort

0

Versuchen:

XMLELEMENT(Name "Telephone", 
case 
when not exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then '' 
when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then 'pv_an4' 
end), 

In Zeile 4, die Sie verwenden pv_an4 als Spalte in der ersten Abfrage, sondern als Spaltenwert in Ihrer zweiten Abfrage.

+0

Das ist, weil ich den Spaltenwert verwenden möchte, wenn die Spalte existiert. Wenn die Spalte nicht existiert, möchte ich das Ergebnis des Falls leer haben. – bibz

+0

Veröffentlichen Sie Ihre vollständige Abfrage. Sie verwenden 'pv_an4', aber nicht von der Tabelle' Telefonbuch', so dass die Verwirrung sein kann. –

+0

@RudyM das OP weiß nicht, ob eine bestimmte Spalte in einer Tabelle existiert oder nicht und möchte dies direkt in der Auswahl behandeln. Hat ihm schon gesagt, dass dies ein Nein ist. – Shadow

2

Die gesamte SQL-Anweisung wird geparst und kompiliert vor ist es ausgeführt, daher wird Postgresql über das fehlende Feld beschweren. Es gibt keine Abkürzung.

Sie müssen dynamisch generierte SQL verwenden, wenn Sie solche Szenarien behandeln möchten (prüfen Sie, ob die Spalte existiert und erstellen Sie die entsprechende SQL-Anweisung). Obwohl ich mir nicht wirklich vorstellen kann, warum man nicht wissen sollte, ob eine bestimmte Spalte in einer Tabelle existiert oder nicht.

+0

Ich habe verschiedene Versionen einer Tabelle. Einer hat das angegebene Feld, ein anderer nicht. Deshalb muss ich prüfen, ob es existiert, sonst schlägt die Abfrage fehl, weil die Spalte nicht existiert. – bibz

+1

Wie Sie sehen können, schlägt die Abfrage trotzdem wegen der fehlenden Spalte fehl. Es gibt keine Verknüpfung, Sie müssen wissen, welche Spalten eine Tabelle hat, bevor Sie sie abfragen. – Shadow

+0

Ok danke, wusste nicht, dass die SQL-Anweisung geparst und kompiliert wird, bevor es ausgeführt wird .. Ich würde in dynamisch generierte sql tauchen. Vielleicht hilft mir das – bibz