Wie kann man zwei Spalten mit dem vorhandenen Spaltennamen in MySQL zu einer zusammenfassen?

74

Ich möchte zwei Spalten in einer Tabelle mit einem vorhandenen Spaltennamen mithilfe von MySQL verketten.

Ein Beispiel: Ich habe eine Spalte FIRSTNAMEund LASTNAMEund so auch viele Spalten. Ich möchte diese beiden Spalten nur mit dem Namen verketten FIRSTNAME.

Also habe ich es so versucht:

 SELECT *, CONCAT(FIRSTNAME, ',', LASTNAME) AS FIRSTNAME FROM `customer`;

Es werden jedoch die beiden Felder mit dem Namen angezeigt FIRSTNAME. Ein Feld hat normale Werte und ein anderes verkettete Werte. Ich möchte nur eine Spalte mit diesen verketteten Werten. Ich kann einzelne Spalten auswählen, habe aber mehr als 40 Spalten in meiner Tabelle.

Gibt es eine Möglichkeit, die ursprüngliche Spalte mit MySQL selbst zu entfernen?

Manik
quelle
1
Siehe diese Frage für relevante Informationen: stackoverflow.com/questions/9122/…
George

Antworten:

92

Wie Aziz-Shaikh betont hat, gibt es keine Möglichkeit, eine einzelne Spalte aus der *Direktive zu unterdrücken. Möglicherweise können Sie jedoch den folgenden Hack verwenden:

SELECT CONCAT(c.FIRSTNAME, ',', c.LASTNAME) AS FIRSTNAME,
       c.*
FROM   `customer` c;

Wenn Sie dies tun, übernimmt das zweite Vorkommen der FIRSTNAMESpalte den Alias, FIRSTNAME_1sodass Sie Ihre angepasste FIRSTNAMESpalte sicher adressieren können sollten . Sie müssen die Tabelle mit einem Alias ​​versehen, da *eine andere Position als zu Beginn fehlschlägt, wenn kein Alias ​​vorliegt.

Hoffentlich hilft das!

Raad
quelle
Also nimmt die PHP-Codierung nur in diesem Fall die erste Spalte ein? Recht?
Manik
1
Wenn Sie in Ihrem PHP-Skript auf "FIRSTNAME" verweisen, wird Ihre Version der Spalte verwendet, da der echte "FIRSTNAME" jetzt "FIRSTNAME_1" heißt. Was macht es Arbeit ist nicht wirklich die Tatsache , dass es die erste Spalte ist, sondern dass sie den gleichen Alias wie die ursprüngliche Spalte verwendet und es aufgeführt ist , bevor die ursprüngliche Spalte. Auf diese Weise wird die ursprüngliche Spalte in einen anderen Namen verschoben.
Raad
13

Anstatt alle Tabellenspalten mit * in Ihrer SQL-Anweisung abzurufen, geben Sie die benötigten Tabellenspalten an.

Sie können die SQL-Anweisung wie folgt verwenden:

SELECT CONCAT(FIRSTNAME, ' ', LASTNAME) AS FIRSTNAME FROM customer;

Übrigens, warum konnten Sie nicht FullName anstelle von FirstName verwenden? So was:

SELECT CONCAT(FIRSTNAME, ' ', LASTNAME) AS 'CUSTOMER NAME' FROM customer;
Alex Alvarez
quelle
3

Sie können diese einfache Methode zum Kombinieren von Spalten ausprobieren:

select some_other_column,first_name || ' ' || last_name AS First_name from customer;
Ayush Gupta
quelle
Dies funktioniert unter Oracle und Postgres. Unter MySQL müssen Sie: SET sql_mode = 'PIPES_AS_CONCAT';
David Borges
1

Entfernen Sie das *aus Ihrer Abfrage und verwenden Sie einzelne Spaltennamen wie folgt:

SELECT SOME_OTHER_COLUMN, CONCAT(FIRSTNAME, ',', LASTNAME) AS FIRSTNAME FROM `customer`;

Mit *Mitteln möchten Sie in Ihren Ergebnissen alle Spalten der Tabelle. In Ihrem Fall *wird auch enthalten FIRSTNAME. Sie verketten dann einige Spalten und verwenden den Alias ​​von FIRSTNAME. Dadurch werden 2 gleichnamige Spalten erstellt.

Aziz Shaikh
quelle
aber ich habe fast 43 Spalten. Ist dies ein einziger Weg? Ich muss andere 42 Spalten in der Abfrage wie diese erwähnen "col1, col2, col3, .. etc auswählen"?
Manik
In diesem Fall können Sie, wie oben von @oGeez erwähnt, die Antworten ausprobieren: stackoverflow.com/questions/9122/…
Aziz Shaikh
0

Entfernen Sie einfach * aus Ihrer select-Klausel, erwähnen Sie alle Spaltennamen explizit und lassen Sie die Spalte FIRSTNAME weg. Danach schreiben Sie CONCAT (FIRSTNAME, ',', LASTNAME) als FIRSTNAME. Die obige Abfrage gibt Ihnen die einzige FIRSTNAME-Spalte.

Babasaheb SP
quelle
-2

Ich bin ein Neuling und habe es so gemacht:

Create table Name1
(
F_Name varchar(20),
L_Name varchar(20),
Age INTEGER
)

Insert into Name1
Values
('Tom', 'Bombadil', 32),
('Danny', 'Fartman', 43),
('Stephine', 'Belchlord', 33),
('Corry', 'Smallpants', 95)
Go

Update Name1
Set F_Name = CONCAT(F_Name, ' ', L_Name)
Go

Alter Table Name1
Drop column L_Name
Go

Update Table_Name
Set F_Name
user10689173
quelle
Sie können auch eine Erklärung dazu hinzufügen, was Sie in Ihrem Code getan haben, um das Verständnis auf einen Blick zu erleichtern.
Andreas