SELECTSELECT

SELECT

Spalten ausschließen und umbenennen bei SELECT * in Snowflake

By Ian WhitestoneDec 17, 20225 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Wozu EXCLUDE und RENAME?

In Snowflakes Release vom November 2022 wurde eher leise eine spannende neue SQL-Syntax angekündigt: EXCLUDE und RENAME. Damit lassen sich beim Ausführen einer SELECT -Abfrage einzelne Spalten entfernen oder umbenennen. Das ist besonders praktisch, denn außerhalb produktiver SQL-Workflows kommen explorative Abfragen vom Typ `SELECT ` ständig zum Einsatz, etwa so:

select *
from table
where id = 5

Meist geht es darum, einen bestimmten Datensatz oder eine Teilmenge davon zu untersuchen. Doch was tun, wenn man eine einzelne Spalte (etwa eine große Textspalte) ausschließen oder eine umbenennen möchte? Bislang musste man sämtliche gewünschten Spalten ausschreiben und für Umbenennungen die klassische AS-Syntax bemühen:

select
  column_1,
  column_2,
  column_3 as column_3_renamed,
  column_4,
  column_5,
  column_6,
  column_7,
  column_8,
  column_9, -- columns 10 and 11 are intentionally left out
  column_12
from table
where id = 5

Nicht gerade ideal, wenn es schnell gehen soll.

Spalten in einer SELECT \*-Abfrage in Snowflake ausschließen

Statt jede Spalte einzeln aufzuzählen, wünschen sich viele Nutzer 1, eine Teilmenge an Spalten angeben zu können, die ausgeschlossen wird. In vielen Fällen ist das deutlich effizienter, da die Anzahl der auszuschließenden Spalten meist viel kleiner ist als die der einzubeziehenden. Seit Snowflakes Release 6.37 können Sie in SELECT *-Abfragen eine EXCLUDE-Klausel einsetzen und damit eine oder mehrere Spalten benennen, die nicht zurückgegeben werden sollen:

select
  *
  exclude(column_10, column_11)
from table
where id = 5

Genauso funktioniert es für eine einzelne Spalte:

select
  *
  exclude (column_10)
from table
where id = 5

Bei einer einzelnen Spalte sind die Klammern optional. Das obige SQL lässt sich also auch so schreiben:

select
  *
  exclude column_10
from table
where id = 5

Snowflakes EXCLUDE mit mehreren Tabellen nutzen

Ein weiterer typischer Anwendungsfall für das Ausschließen von Spalten ist der Join mehrerer Tabellen. Stellen Sie sich folgende Abfrage vor 2:

select
  orders.*,
  customers.* exclude customer_id,
  items.* exclude order_id
from orders
join customers
  on orders.customer_id=customers.customer_id
join items
  on orders.order_id=items.order_id

In diesem Beispiel tauchen in der Ausgabe jeweils zwei order_id- und zwei customer_id-Spalten auf, weil sie in mehreren Tabellen vorkommen. Mit einer kleinen Anpassung der SQL-Abfrage lassen sie sich problemlos ausschließen:

select
  orders.*,
  customers.* exclude customer_id,
  items.* exclude order_id
from orders
join customers
  on orders.customer_id=customers.customer_id
join items
  on orders.order_id=items.order_id

Snowflakes Pendant zu EXCEPT in BigQuery und Databricks

Snowflakes EXCLUDE-Syntax ähnelt der EXCEPT-Syntax von BigQuery und Databricks:

-- Snowflake
select
  *
  exclude(column_10, column_11)
from table

-- BigQuery/Databricks
select
  *
  except(column_10, column_11)
from table

Wer DuckDB kennt, wird die Schreibweise wiedererkennen: Snowflake setzt auf dieselbe EXCLUDE-Syntax, die auch DuckDB verwendet. Beide Datenbanken haben das Schlüsselwort EXCEPT für diese Funktion vermutlich bewusst vermieden, da es bereits in Mengenoperationen genutzt wird.

Sollten Sie EXCLUDE in produktivem SQL-Code einsetzen?

Diese neue Syntax beschleunigt zwar Ad-hoc-Workflows deutlich, für produktiven SQL-Code ist sie aber nicht zu empfehlen. Dort sollten Sie die ausgewählten Spalten explizit benennen. Werden alle Spaltennamen ausgeschrieben, gewinnen Lesbarkeit und Nachvollziehbarkeit: Wer Ihren SQL-Code liest, erkennt sofort, welche Spalten aus welcher Tabelle verwendet werden. Auch Fehler lassen sich so klarer zuordnen. Wird eine Spalte plötzlich aus einer Tabelle entfernt, schlägt Ihr SQL-Code unmittelbar fehl – deutlich besser, als wenn eine nachgelagerte Anwendung wegen einer fehlenden Spalte unerwartet abbricht.

Führt EXCLUDE in Snowflake zu einem anderen Query-Plan oder einer anderen Performance?

Nein. Das Schlüsselwort EXCLUDE zum Entfernen einzelner Spalten erzeugt weder einen anderen Query-Plan noch eine andere Performance als das explizite Ausschreiben sämtlicher Spalten. Sie können das selbst nachvollziehen, indem Sie beide Varianten auf einem Datensatz in Ihrem Snowflake-Konto ausführen und das Query Profile der jeweiligen Abfrage analysieren.

Spalten in einer SELECT \*-Abfrage in Snowflake umbenennen

Vor der neuen RENAME-Funktion mussten sämtliche Spaltennamen ausgeschrieben werden, sobald in einer SELECT *-Abfrage auch nur eine einzige umbenannt werden sollte. Jetzt lassen sich alle Spalten auswählen und eine Teilmenge davon bequem umbenennen:

select
  *
  rename (column_3 as column_3_renamed, column_5 as column_5_renamed)
from table
where id = 5

Das ist deutlich angenehmer, als jede Spalte aufzuzählen, nur um ein oder zwei davon umzubenennen:

-- old method 👎
select
  column_1,
  column_2,
  column_3 as column_3_renamed,
  column_4,
  column_5 as column_5_renamed,
  column_6,
  ...
  column_12
from table
where id = 5

Wie bei EXCLUDE funktioniert das auch für eine einzelne Spalte, Klammern optional:

select
  *
  rename (column_3 as column_3_renamed)
from table
where id = 5

EXCLUDE und RENAME kombinieren

EXCLUDE und RENAME lassen sich problemlos kombinieren, wie das folgende Beispiel zeigt:

select
  *
  exclude(column_10, column_11)
  rename column_3 as column_3_renamed
from table
where id = 5

Ein klarer Fortschritt gegenüber dem Code vom Anfang dieses Blogposts:

select
  column_1,
  column_2,
  column_3 as column_3_renamed,
  column_4,
  column_5,
  column_6,
  column_7,
  column_8,
  column_9, -- columns 10 and 11 are intentionally left out
  column_12
from table
where id = 5

Anmerkungen

  1. Zur Einordnung der Nachfrage: Diese Stack-Overflow-Frage wurde vor fast 14 Jahren gestellt und kommt heute auf 1,3 Millionen Aufrufe und über 1000 Upvotes.

  2. Ein Dankeschön an Nate Sooter, der dieses Beispiel mit seinem jüngsten Tweet angestoßen hat!

Ian Whitestone·Co-Founder & CEO von SELECT

Ian ist Co-Founder und CEO von SELECT, einer SaaS-Plattform für Kostenmanagement und Optimierung in Snowflake. Vor SELECT leitete er sechs Jahre lang Full-Stack-Data-Science- und Engineering-Teams bei Shopify und Capital One. Bei Shopify verantwortete er die Optimierung des Data Warehouse und den Ausbau der Kostentransparenz.