2009-06-12 7 views
10

Ich möchte Spaltennamen so verketten, dass der erste Teil des Spaltennamens eine Zeichenfolge und der zweite Teil eine Zahl ist, die das Ergebnis einer anderen Abfrage ist.MySQL concat() zum Erstellen von Spaltennamen in einer Abfrage verwendet werden?

Zum Beispiel:

SELECT CONCAT('column', mytable.mycolumn) FROM table ... 

Kann dies in irgendeiner Weise erfolgen. Auf diese Weise gibt es mir keine Fehler, aber ich bekomme nicht das erwartete Ergebnis und es scheint, dass die Verkettung nicht funktioniert.

+0

Ich denke ... Sie ein anderes der CONCAT SELECT innen verwenden können Wenn nicht, müssen Sie eine gespeicherte Prozedur erstellen. Habe hier kein MysQL zum testen, also kommentiere statt antworten. – TimothyP

Antwort

22

ich zuvor gesagt, dass dies nicht getan werden kann, aber ich war falsch. Ich brauchte so etwas selbst, also schaute ich mich um und entdeckte, dass Sie mit server-side prepared statements beliebige SQL-Anweisungen aus Strings erstellen und ausführen können.

Hier ist ein Beispiel, das ich nur das Konzept zu beweisen tat:

set @query := (
    select concat(
    "select", 
     group_concat(concat("\n 1 as ", column_name) separator ','), 
    "\nfrom dual") 
    from information_schema.columns 
    where table_name = 'columns') 
; 
prepare s1 from @query 
; 
execute s1 
; 
deallocate prepare s1 
; 
+0

Ich denke, dass ist der Fall, und ich muss akzeptieren, dass ich nicht tun kann, was ich in einer Abfrage möchte, so schön wie es gewesen wäre. – markus

+0

@tharkun Ich habe meine Antwort umgekehrt. Beachten Sie, dass gemäß der Dokumentation diese Funktion mindestens Version 5.0 von MySQL erfordert. –

2

Ich glaube nicht, dass Sie dies mit CONCAT() und CONCAT_WS() tun können. Ich würde empfehlen, die Sprache zu verwenden, mit der Sie die Feldnamen erstellen. Dies zu tun wäre ziemlich beängstigend, abhängig davon, woher die Daten in der Datenbank stammen.

+0

Könntest du auf gruselig näher eingehen? Die zu verkettenden Daten sind eine automatisch_inkrementierte ID (primär). – markus

+0

Bitte überarbeiten Sie Ihre Frage. Wenn die von Ihnen verwendete Nummer eine automatisch_inkrementierte ID ist, wie viele Spalten erwarten Sie dann in Ihrer Tabelle? Ich denke, ich verstehe die Frage nicht, wie ich hoffe, diese Tabelle hat keine Spalten wie "Spalte1", "Spalte2, ...," Spalte90000 ", ... – Arjan

+0

Art von aber nicht wirklich. Die Spalten sind Ergebnisse zu einzelne Fragen, ein Benutzer pro Reihe, also ist es ein Ergebnissatz der Fragebogenresultate jede Frage hat eine Identifikation und diese Identifikation ist im Spaltennamen enthalten – markus

12

Wenn die Anzahl der Spalten festgelegt ist, dann wird ein nicht-dynamischer Ansatz sein könnte:

select 
    case mytable.mycolumn 
    when 1 then column1 -- or: when 'a' then columna 
    when 2 then column2 
    when ... 
    else ... 
    end as my_semi_dynamic_column 
from ... 
+0

danke für die Idee. es wird nicht funktionieren, weil es komplett generisch sein muss. – markus

+0

Wenn ich deine Frage noch einmal lese, sehe ich, dass du Zahlen verwendest. Also änderte ich das "wenn" eine "dann columna" in "wenn 1 dann column1". Ist die Anzahl der 'columnxx'-Spalten in Ihrer Tabelle wirklich so hoch ...? – Arjan

+0

Ja, es ist ziemlich hoch und es ändert sich.also brauche ich etwas Dynamisches und Generisches. – markus

0

Ich würde information_schema empfehlen suchen. Der folgende Code ist nicht getestet, sollte aber theoretisch funktionieren. Offensichtlich ersetzen Sie Ihren Tabellennamen mit einem entsprechenden Tabellennamen oder einen Link zu INFORMATION_SCHEMA.TABLES und verwenden Sie die table_type in Ihrer where-Klausel

select concat('column', column_name) from information_schema.columns where table_name ='your table name' 
+0

Warum sollte es für die Auswahl im information_schema funktionieren, wenn es sonst nicht funktioniert? – markus

+0

Dies ruft die Spaltennamen ab, nicht den Inhalt der Spalte (welcher Name ist dynamisch). – Arjan

+0

ja, macht Sinn, danke für den Hinweis! Ich probiere das jetzt schon ... – markus

-1

Sie einfach folgende Abfrage verwenden:

SELECT group_concat(COLUMN_NAME) FROM information_schema.columns WHERE table_name ='your table name'; 
Verwandte Themen