Wie erstelle ich eine virtuelle Spalte mit MySQL SELECT?

70

Wenn ich SELECT a AS b mache und b keine Spalte in der Tabelle ist, würde die Abfrage die "virtuelle" Spalte erstellen?

Tatsächlich muss ich eine virtuelle Spalte in die Abfrage einbinden und einige Informationen in die Abfrage verarbeiten, damit ich sie später für jedes Element verwenden kann.

Skuta
quelle
1
Ich habe die Frage ein paar Mal gelesen und es muss etwas geben, das mir fehlt. Könnten Sie etwas genau erklären, wonach Sie suchen?
lc.
1
Stellen Sie sich die Abfrage als Array von Zeilen und Spalten vor. Normalerweise erbe ich nur Spalten von der Tabellenstruktur durch einfaches SELECT * FROM, aber jetzt müsste ich meine eigene Spalte einfügen.
Skuta
2
Vielleicht sollten Sie einen Blick auf die Dokumentation

Antworten:

91

Etwas wie:

SELECT id, email, IF(active = 1, 'enabled', 'disabled') AS account_status FROM users

Auf diese Weise können Sie Vorgänge ausführen und als Spalten anzeigen.

BEARBEITEN:

Sie können auch Verknüpfungen verwenden und Operationen als Spalten anzeigen:

SELECT u.id, e.email, IF(c.id IS NULL, 'no selected', c.name) AS country
FROM users u LEFT JOIN countries c ON u.country_id = c.id
Gabriel Sosa
quelle
Dieser Beitrag bringt mein Wissen über einfache MySQL-Anweisungen einen Weg nach vorne :), bedeutet das, dass ich JEDE "Spalte" erstellen kann?
Skuta
1
Sie können diese neue Spalte jedoch nicht für Operationen oder neue IF-Auswertungen verwenden ... oder ja?
Luis
1
Sie können damit Zeilen filtern. Anstatt die Bedingung in die WHERE-Klausel aufzunehmen, müssen Sie sie in eine HAVING-Klausel einfügen: HAVING country = 'Germany' zum Beispiel.
Marsbear
67

Versuchen Sie dies, wenn Sie eine virtuelle Spalte "age" innerhalb einer select-Anweisung erstellen möchten:

select brand, name, "10" as age from cars...
Ninsky
quelle
1
Guter Trick. Einfach, aber das hatte ich noch nie versucht. Genau das habe ich mich gefragt! : D
Atomox
Hier ist ein etwas komplizierter Trick für die Arbeit mit anderen Tabellen in derselben MySQL-Abfrage: SELECT tpt. *, (SELECT COUNT (*) FROM Orte WHERE tpt.id = Orte.Typ) als obj_count FROM places_typesals tpt ORDER BY tpt.name ASC GRENZE ?,?
Realmag777
Dies ist ein besonders guter Trick bei der Gründung von Gewerkschaften, bei denen es vorteilhaft ist zu wissen, aus welchem ​​Teil der Gewerkschaft eine Reihe stammt. Fügen Sie einfach eine andere Konstante in jede Auswahl ein, die angibt, aus welchem ​​Block die Zeile stammt. Und eine Million und eine andere Verwendung.
Scott8035
14

Sie können virtuelle Spalten als hinzufügen

SELECT '1' as temp

Wenn Sie jedoch versuchen, eine Bedingung in eine zusätzlich generierte Spalte einzufügen, funktioniert dies nicht und es wird eine Fehlermeldung angezeigt, da die Spalte nicht vorhanden ist.

Wir können dieses Problem lösen, indem wir das SQL-Ergebnis als table.ie zurückgeben.

SELECT tb.* from (SELECT 1 as temp) as tb WHERE tb.temp = 1
rb vishnu
quelle
3

SELECT ruft nur Daten aus der Datenbank ab und ändert die Tabelle selbst nicht.

Wenn du schreibst

SELECT a AS b FROM x

"b" ist nur ein Aliasname in der Abfrage. Es wird keine zusätzliche Spalte erstellt. Ihr Ergebnis im Beispiel würde nur eine Spalte mit dem Namen "b" enthalten. Aber die Spalte in der Tabelle würde "a" bleiben. "b" ist nur ein anderer Name.

Ich verstehe nicht wirklich, was du mit "damit ich es später mit jedem Gegenstand verwenden kann" meinst. Meinen Sie später in der select-Anweisung oder später in Ihrer Anwendung. Vielleicht könnten Sie einen Beispielcode bereitstellen.

Sebastian Dietz
quelle
1

Sie könnten eine CASE-Anweisung verwenden, wie z

SELECT name
       ,address
       ,CASE WHEN a < b THEN '1' 
             ELSE '2' END AS one_or_two
FROM ...
jazcap53
quelle
0

Ihre Syntax würde einen Alias ​​für a als b erstellen, aber keinen Umfang haben, der über die Ergebnisse der Anweisung hinausgeht. Es hört sich so an, als ob Sie eine ANSICHT erstellen möchten

cmsjr
quelle