Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Wildcard in select

Nicht wirklich. Sie können den * verwenden Spaltenplatzhalter um alle Spalten auszuwählen. Wenn Sie mehrere Tabellen zusammenführen, können Sie alle Spalten aus einer bestimmten Tabelle auswählen, indem Sie * voranstellen mit dem Tabellennamen oder Alias:

SELECT a.id, a.title, b.*
  FROM articles AS a
    JOIN blurbs AS b ON a.id = b.article

Sie sollten jedoch nicht * verwenden es sei denn, Sie schreiben ein DB-Verwaltungsprogramm.

Alternativ können Sie eine Anweisung in SQL oder einer anderen Sprache erstellen, indem Sie Tabellenmetadaten abrufen, um die Spaltennamen zu erhalten. Wenn Sie nur MySQL verwenden, können Sie die COLUMNS Tabelle im INFORMATION_SCHEMA Datenbank, um die Spaltennamen zu erhalten und verwenden Sie GROUP_CONCAT um die Spaltenliste für die Anweisung zu erstellen.

SELECT CONCAT(
      'SELECT ',
      GROUP_CONCAT(COLUMN_NAME SEPARATOR ', '),
      ' FROM ', :db, '.', :table,
      ' WHERE ...'
      )
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA=:db AND TABLE_NAME=:table

Ersetzen Sie ":db", ":table" und "..." durch die entsprechenden Werte. Sie können es sogar in eine vorbereitete Anweisung umwandeln, sodass Sie es für jede Tabelle verwenden können. Von dort PREPARE und EXECUTE die konstruierte Anweisung.

Wenn Sie beim Programmieren nicht auf SQL beschränkt sind, sollte es weniger chaotisch sein. Der DB-Treiber für die Sprache Ihrer Wahl bietet wahrscheinlich Methoden zum Abrufen von Metadaten. Die eigentliche Implementierung wäre dem reinen SQL-Ansatz ähnlich (Spaltennamen abrufen, Anweisung zusammenbauen, vorbereiten, ausführen), sollte aber nicht so hässlich sein, da Sie eher eine algorithmische als eine deklarative Sprache verwenden würden.

Mich würde sehr interessieren, in welcher Situation dies tatsächlich erforderlich ist..