2016-12-07 6 views
4

Ich muss nur eine Spalte auswählen, wenn sie in der Tabelle existiert, sonst kann sie auf null gesetzt werden.SQL - bedingt eine Spalte auswählen, wenn vorhanden

Probentabelle unten, kann sagen, dass die marks col es nicht notwendig sein wird, so muß überprüft werden, wenn es

Tabelle 1 existiert:

name marks 
joe 10 
john 11 
mary 13 

Abfrage:

select 
    name, 
    marks if it exists else null as marks1 -- pseudo code 
from 
    table1 

Was sollte in Zeile gehen, um marks auszuwählen?

+0

Wie würden Sie * nicht * wissen, ob 'marks' eine Spalte in table1 ist? –

+0

Sie sollten die Art, wie Sie Ihr Datenbankschema und die Migration verwalten, wirklich überdenken. Die Tatsache, dass Sie nicht wissen, ob eine Spalte existiert oder nicht, könnte darauf hinweisen, dass Sie den falschen Prozess zum Erstellen und Aktualisieren Ihrer Tabellen in der Datenbank verwenden. Auch: eine 'marks1' Tabelle könnte auch ein Zeichen für ein nicht normalisiertes Design sein. Sie könnten etwas ähnliches mit dynamischem SQL erreichen, aber es wäre ** viel besser, die Art und Weise zu korrigieren, wie Sie Ihre Tabellen verwalten. –

+1

@a_horse_with_no_name Ein breiterer Punkt - aber das ist keine Frage zu Schema und Migration - echte Daten sind chaotisch :) und der Kontext ist keine Anwendung, es sind einige reale Daten, die von einer Quelle stammen, auf die ich keine Kontrolle habe - es kann oder auch nicht alle erwarteten Spalten - die Frage war wirklich in diesem Kontext, wenn es möglich ist überprüfen Sie dies. – user3206440

Antwort

0

Try this:

IF EXISTS(SELECT 1 
      FROM information_schema.columns 
      WHERE table_name='your_table' and column_name='your_column') THEN 
    SELECT your_column as 'some_column' 
ELSE 
    SELECT NULL as 'some_column' 
END IF 
+0

IF EXISTS() ist nicht sql ... –

+0

@EvanCarroll PostgreSQL unterstützt 'EXISTS()' nicht? –

+0

Ja, in 'plpgsql'. Das ist eine prozedurale Sprache und eine von vielen, die PostgreSQL unterstützt. Das ist jedoch nicht SQL. Sie können nicht einfach ein Snippet ausführen, das ansonsten in der prozeduralen Sprache gültig ist. –

0

versuchen, diese

IF COL_LENGTH('your_table_name','column_name_you_want_to_select') IS NULL BEGIN 
--This means columns does not exist or permission is denied 
END 
else 
--Do whatever you want 
5

SQL, dass nicht zulässt. Ihre Ergebnismenge hat zwei Möglichkeiten:

  1. Statische Aufnahme
  2. Alle aus der Tabelle oder Unterabfrage durch Spaltenerweiterung mit * und tbl.*

Vielleicht wird dies Ihre Bedürfnisse anzupassen, SELECT * FROM table1; Sie werden immer erhalten diese Spalte, wenn sie existiert.

Verwandte Themen