Zugriff auf Tabellenspalte über Index

Tilman Räger

Benutzer
Beiträge
10
Hallo,
gibt es eine möglichkeit, auf eine bestimmte Spalte einer Tabelle zuzugreifen, OHNE den Spaltennamen zu verwenden?

Hintergrund
wir versuchen den Inhalt einer Tabelle zu übertragen, wobei wir nicht wissen, ob diese Tabelle eine best. Spalte enthält. In der neuen Tabelle soll diese Spalte dann entweder mit den Werten aus der alten Tabelle (falls dort die Spalte schon existiert) oder mit einem Defaultwert belegt werden.
Was wir sicher wissen, ist das diese Spalte auf jeden Fall die letzte Spalte der Tabelle ist.
Mit einer CASE Anweisung haben wir zumindest schon einmal geschafft, die korrekten Werte einzutragen, wenn die Spalte exisitiert bzw. falls die Spalte nicht existiert entsprechende Defaults zu setzen. (allerdings muss in letzterm Fall die Select-Anweisung im einen Case-Zweig ersetzt werden, durch eine Konstante). Sobald man in diesem Case-Zweig auf das Feld zugreifen will, bekommt man die Antwort 'Error: Feld existiert nicht'.
Könnte man hier eine Select-Anweisung auf die letzte Spalte der Tabelle ausführen, so wäre das problem gelöst.

Danke im Voraus
Tilman (Räger)
 
Werbung:
Das tun wir ja bereits - wir holen uns die Information, ob das Feld vorhanden ist, aus der Tabelle sqlite_master. Abhängig davon wollen wir dann einen Defaultwert (falls das Feld nicht vorhanden ist) oder eben den Inhalt dieser Spalte einfügen. Nur: Wenn die Spalte nicht vorhanden ist, geht SQLite trotzdem die gesamte Case-Anweisung durch und stellt dann fest, die Spalte 'xy' gibt es nicht -> Fehler -> Absturz des Datenbank-Updates. (Eine genauere Erläuterung des Problems findet man im Thread 'If-Abfrage in SQL-Skript-Datei').
Unser Gedanke war, wenn wir an dieser Stelle nicht 'select xy ...' sondern select column(3)' bzw. noch besser 'select column(column_count() - 1) ...' schreiben können, wäre unser Problem gelöst. Wichtig ist, der Name der Spalte darf nicht in der Select-Anweisung auftauchen - diese darf aber (wenn sie z.B. erst während der Laufzeit zusammengebaut wird) auch nicht zu einem Fehler führen wenn die Spalte nicht existiert.
 
Ich denke mal, das, was Du vorhast, wird nicht funktionieren. Der Parser, der zuerst Dein SQL sieht und einen Abfrageplan erstellt, kann nicht wissen, ob die Spalte da ist oder nicht. Wir hatten das ähnlich schon einmal in dem von Dir genannten Thread besprochen. Du wirst, wie schon da gesagt, dynamisch ein SQL bauen und dieses ausführen müssen.
 
Werbung:
Abgesehen davon das ich auch dynamisches SQL empfehlen würde, in MSSQL gibt es noch ein TRY CATCH Befehl der den Fehler abfangen könnte. Ob es sowas in SQLite gibt ist mir nicht bekannt.
 
Zurück
Oben