1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Zugriff auf Tabellenspalte über Index

Dieses Thema im Forum "SQLite" wurde erstellt von Tilman Räger, 11 November 2016.

  1. Tilman Räger

    Tilman Räger Benutzer

    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)
     
  2. akretschmer

    akretschmer Datenbank-Guru

    was spricht dagegen, diese Information aus dem Information-Schema zu holen? Ich vermute zumindest, daß es das auch in SQLite gibt.
     
  3. Tilman Räger

    Tilman Räger Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden