18 Stimmen

MySQL concat() zum Erstellen von Spaltennamen, die in einer Abfrage verwendet werden sollen?

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.

Zum Beispiel:

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

Kann dies auf irgendeine Weise geschehen? Auf diese Weise gibt es keine Fehler, aber ich erhalte nicht das erwartete Ergebnis und es scheint, dass die Verkettung nicht funktioniert.

27voto

Chris Vest Punkte 8512

Ich hatte zuvor gesagt, dass dies nicht möglich sei, aber ich hatte Unrecht. Ich brauchte so etwas schließlich selbst, also habe ich mich umgesehen und entdeckt, dass Server-seitige vorbereitete Anweisungen können Sie beliebige SQL-Anweisungen aus Zeichenketten erstellen und ausführen.

Hier ist ein Beispiel, das ich gerade gemacht habe, um das Konzept zu beweisen:

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
;

15voto

Arjan Punkte 21308

Wenn die Anzahl der Spalten festgelegt ist, könnte ein nicht-dynamischer Ansatz gewählt werden:

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

3voto

Darryl Hein Punkte 138311

Ich glaube nicht, dass man das mit CONCAT() y CONCAT_WS() . Ich würde empfehlen, die Sprache zu verwenden, mit der Sie arbeiten, um die Feldnamen zu erstellen. Auf diese Weise zu tun, wäre ziemlich beängstigend, je nachdem, woher die Daten in der Datenbank stammen.

0voto

Steve Punkte 21

Ich würde vorschlagen, dass Sie sich Folgendes ansehen information_schema . Der folgende Code ist ungetestet, sollte aber theoretisch funktionieren. Ersetzen Sie natürlich Ihren Tabellennamen durch einen geeigneten Tabellennamen oder verlinken Sie auf information_schema.tables und verwenden Sie den table_type in Ihrer where-Klausel

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X