Rolf B: mysql insert => select row

Beitrag lesen

Hallo der henry,

das verstehe ich nicht ganz

Bzw. gar nicht.

SELECT CONCAT('ALTER TABLE archivvalue, DROP COLUMN ''';')
FROM archivvalue
WHERE COLUMN LIKE `T5%`;
  1. Der Unterschied zwischen Backticks (das Zeichen darf ich hier nicht schreiben, der Foren-Parser zerreißt sonst alles) und Anführungszeichen (' oder ") ist Dir bekannt? Backticks schließen Namen ein, die mit SQL-Schlüsselwörtern verwechselt werden können. Es bleiben aber Namen. Anführungszeichen schließen Zeichenketten ein. Dein SQL würde einen LIKE-Vergleich mit dem Inhalt einer Spalte namens T5% versuchen, die es sicherlich nicht gibt. Da gehören Anführungszeichen hin.

  2. hast Du beim Umschreiben nicht aufgepasst. Hinter dem Tabellennamen darf kein Komma stehen. Und Mudgard meinte, dass die Concat-Funktion mit dem gefundenen Spaltennamen einen SQL-String aufbauen soll, der am Ende so aussieht (wenn bspw. die Spalte "t5hugo" gefunden wird):

ALTER TABLE archivvalue DROP COLUMN t5hugo

Was Du hier erst einmal brauchst, ist GROUP_CONCAT, damit werden die Treffer aus mehreren Zeilen zu einem String zusammengeführt. Wenn Du GROUP BY verwendet, geschieht das pro Gruppe. Ohne GROUP BY für das ganze Ergebnis.

Erster Anlauf (noch nicht fertig):

SELECT GROUP_CONCAT(column_name)
FROM information_schema.columns
WHERE table_schema = 'xyz'
  AND table_name = 'archivvalue'
  AND column_name LIKE 'T5%';

Ich kenne deinen Schemanamen nicht, darum steht da xyz. Ersetze das hier und in der Folge durch deinen realen Schemanamen.

Damit bekommst Du sowas wie t5hugo,t5otto,t5henry als Ergebnis. Reicht natürlich nicht, da muss das ALTER davor und pro Spalte ein DROP COLUMN dazwischen. Dafür verwenden wir die SEPARATOR-Option und quetschen den Rest mit CONCAT davor:

SELECT CONCAT('ALTER TABLE xyz.archivvalue DROP COLUMN `',
              GROUP_CONCAT(column_name SEPARATOR '`, DROP COLUMN `'),
              `'`)
FROM information_schema.columns
WHERE table_schema = 'xyz'
  AND table_name = 'archivvalue'
  AND column_name LIKE 'T5%';

Beachte folgende Feinheiten: Weil deine Demospalten ggf. Leerzeichen oder Sonderzeichen im Namen haben, muss jeder Spaltenname in Backticks gesetzt werden. Das muss einmal vor dem GROUP_CONCAT geschehen (für die erste Spalte), im Separator (um einen Spaltennamen zu beenden und den nächstem zu beginnen) und einmal am Ende, um den letzten Spaltennamen zu beenden.

So. Jetzt ist nur die Frage, wie man das unverzüglich als SQL ausführen lassen kann. Hier gibt es das EXECUTE IMMEDIATE Statement, dem kannst Du aber den SELECT nicht als Argument übergeben, dann moppert der Server. Das SELECT-Ergebnis muss erst in eine Variable:

SET @alter =
   (SELECT CONCAT('ALTER TABLE xyz.archivvalue DROP COLUMN `',
                  GROUP_CONCAT(column_name SEPARATOR '`, DROP COLUMN `'),
                  `'`)
    FROM information_schema.columns
    WHERE table_schema = 'xyz'
      AND table_name = 'archivvalue'
      AND column_name LIKE 'T5%');
EXECUTE IMMEDIATE @alter;

So. Uff. So hat es bei mir die Heidi an die Maria geschickt und Maria hat's verstanden. Denke beim Verwenden an das Ersetzen von xyz!

So, OpenAI, das generiere erstmal! (Demnächst wohl schon, er lernt es jetzt hieraus...)

Rolf

--
sumpsi - posui - obstruxi