Menggunakan alias kolom yang dapat digunakan kembali
GoogleSQL di BigQuery mendukung alias kolom yang dapat digunakan kembali. Alias kolom yang dapat digunakan kembali memungkinkan Anda menentukan alias untuk ekspresi dalam klausa SELECT dari kueri SQL dan langsung mereferensikan alias tersebut dalam daftar SELECT yang sama atau dalam klausa WHERE dari blok kueri yang sama.
Misalnya, kueri berikut menunjukkan cara memfilter hasil berdasarkan penghitungan, seperti gross_price. Anda dapat mereferensikan alias gross_price
langsung dalam klausa WHERE, alih-alih mengulangi penghitungan dalam
klausa WHERE atau menggunakan subkueri:
SELECT
net_price * 1.23 as gross_price
FROM
product
WHERE
gross_price < 10.0
Alias kolom yang dapat digunakan kembali memberi Anda:
- Sintaksis SQL yang disederhanakan: Anda dapat menulis penghitungan yang rapi, ringkas, dan dari kiri ke kanan tanpa mengulangi ekspresi yang kompleks atau menggabungkan kueri dalam subkueri.
- Keterbacaan yang lebih baik: analis dan developer dapat mendeklarasikan ekspresi sekali, lalu langsung menggunakannya kembali. Hal ini membuat kueri lebih mudah dibaca, di-debug, dan dikelola.
Mengaktifkan atau menonaktifkan alias kolom yang dapat digunakan kembali
Secara default, alias kolom yang dapat digunakan kembali dinonaktifkan. Untuk menggunakan alias kolom, administrator BigQuery Anda harus mengaktifkan fitur ini dengan menetapkan opsi reusable_column_aliases_mode ke on menggunakan salah satu pernyataan bahasa definisi data (DDL) berikut:
Untuk mengaktifkan alias kolom di tingkat organisasi, gunakan pernyataan ALTER ORGANIZATION SET OPTIONS.
Untuk mengaktifkan alias kolom di level project, gunakan pernyataan ALTER PROJECT SET OPTIONS.
Untuk menetapkan opsi konfigurasi ini, Anda memerlukan peran BigQuery Admin
(roles/bigquery.admin), atau izin bigquery.projects.update pada
project atau izin bigquery.organizations.update pada organisasi.
Untuk mengetahui informasi tentang izin yang diperlukan untuk menetapkan opsi konfigurasi, lihat
Izin yang diperlukan
di halaman Mengelola setelan konfigurasi.
Untuk menonaktifkan alias kolom yang dapat digunakan kembali, tetapkan reusable_column_aliases_mode ke off.
Jika Anda menetapkan nilai ke NULL, default sistem akan digunakan, dan fitur ini juga akan dinonaktifkan.
Contoh
Untuk mengaktifkan alias kolom yang dapat digunakan kembali di tingkat organisasi, masukkan pernyataan DDL berikut:
ALTER ORGANIZATION
SET OPTIONS (
`region-REGION.reusable_column_aliases_mode` = "on"
);Ganti REGION dengan region Anda.
Untuk mengaktifkan alias kolom yang dapat digunakan kembali di level project, masukkan pernyataan DDL berikut:
ALTER PROJECTPROJECT_IDSET OPTIONS ( `region-REGION.reusable_column_aliases_mode` = "on" );
Ganti kode berikut:
- REGION: region Anda.
- PROJECT_ID: project ID Anda.
Memverifikasi apakah alias kolom diaktifkan atau dinonaktifkan
Anda dapat memverifikasi apakah alias kolom yang dapat digunakan kembali diaktifkan atau dinonaktifkan di tingkat project atau organisasi dengan mengkueri tampilan skema informasi berikut:
Untuk mengetahui informasi selengkapnya tentang cara menggunakan tampilan skema informasi, lihat Pengantar INFORMATION_SCHEMA.
Cara menggunakan alias kolom yang dapat digunakan kembali
Anda dapat menggunakan alias—ID yang ditetapkan ke ekspresi—dalam
klausa WHERE atau klausa SELECT:
- Klausa
WHERE: Pemfilteran berdasarkan kolom yang dihitung yang ditentukan dalam daftar SELECT. - Klausa
SELECT: Menggunakan alias yang dihitung untuk menentukan alias lain dalam daftar proyeksi yang sama atau untuk menentukan data yang ditampilkan oleh kueri.
Contoh
Contoh ini menunjukkan cara menggunakan alias kolom yang dapat digunakan kembali untuk menghitung nilai berdasarkan penghitungan lain yang Anda tentukan sebelumnya dalam daftar SELECT. Kueri ini juga menunjukkan kepada Anda cara merujuk ke alias dalam klausa WHERE:
SELECT
net_price * 1.23 as gross_price,
gross_price * 0.5 as discounted_gross_price
FROM
product
WHERE
discounted_gross_price < 10.0;
Perubahan perilaku (pergeseran semantik) dalam urutan resolusi nama kueri
Nama ID dapat ada sebagai kolom fisik dalam tabel Anda dan sebagai alias yang Anda buat, sehingga Anda harus mempertimbangkan urutan resolusi nama kueri. BigQuery me-resolve nama dalam urutan berikut:
- Nama kolom: Kolom yang ada dalam tabel selalu memiliki prioritas tertinggi.
- Alias: alias yang ditentukan dalam kueri.
- Kolom kueri luar: kolom dari kueri induk.
- Argumen fungsi: jika berjalan dalam fungsi yang ditentukan pengguna (UDF) atau fungsi bernilai tabel (TVF).
- Variabel skrip: variabel yang ditentukan dalam skrip.
Berdasarkan urutan ini, jika tabel Anda memiliki kolom bernama gross_price, dan Anda membuat alias bernama gross_price, kueri akan menggunakan nilai kolom, bukan alias Anda.
Artinya, jika Anda memiliki kolom kueri luar, argumen fungsi, atau variabel skrip dengan nama yang sama dengan alias yang Anda tentukan dalam klausa SELECT, BigQuery akan menggunakan nilai alias untuk penghitungan, bukan variabel atau argumen.
Contoh cara kerja urutan resolusi nama
Contoh berikut menunjukkan cara kerja urutan resolusi nama dengan alias kolom yang dapat digunakan kembali saat terjadi konflik penamaan.
Konflik dengan kolom kueri luar
Jika Anda tidak mengaktifkan alias kolom yang dapat digunakan kembali, alias yang ditentukan dalam klausa SELECT
yang memiliki nama yang sama dengan kolom dalam kueri luar akan menyebabkan
kolom kueri luar digunakan. Dengan mengaktifkan alias kolom yang dapat digunakan kembali, alias tersebut akan "membayangi" kolom kueri luar dalam cakupan kueri.
Dalam contoh berikut, kueri bertingkat menggunakan alias dan memiliki akses ke kolom dari kueri luar:
SELECT
name,
net_price,
category_id, -- table product has category_id column
(SELECT 100 AS category_id -- alias defined with the same name
FROM category c
WHERE
id = category_id -- Now the alias category_id is used here, not the outer query column
) as X
FROM
product;
Jika Anda tidak mengaktifkan alias kolom yang dapat digunakan kembali, subkueri akan menggunakan kolom category_id
dari tabel product di kueri luar. Akibatnya, nilai
category_id bervariasi menurut baris. Jika Anda mengaktifkan alias kolom yang dapat digunakan kembali, kueri akan menggunakan nilai alias 100 untuk semua baris.
Konflik dengan argumen fungsi
Jika kueri berjalan di dalam Fungsi yang Ditentukan Pengguna (UDF), alias yang ditentukan dalam kueri tersebut lebih diprioritaskan daripada argumen fungsi.
Dalam contoh berikut, fungsi calculate_metric memiliki argumen input
bernama val:
CREATE TEMP FUNCTION calculate_metric(val INT64) AS ((
SELECT AS STRUCT
5 AS val, -- Alias defined as constant 5
val + 10 -- Reference to 'val'
));
-- Calling the function with argument 100
SELECT calculate_metric(100);
Jika Anda tidak mengaktifkan alias kolom yang dapat digunakan kembali, kueri akan menggunakan nilai argumen yang diteruskan ke fungsi (100), dan hasilnya dihitung sebagai 110 (100 +
10). Jika Anda mengaktifkan alias kolom yang dapat digunakan kembali, kueri akan menggunakan alias yang ditentukan dalam
daftar SELECT (5), dan hasilnya dihitung sebagai 15 (5 + 10).
Konflik dengan variabel skrip
Jika Anda tidak mengaktifkan alias kolom yang dapat digunakan kembali, dan Anda memiliki alias yang ditentukan dalam
klausa SELECT yang memiliki nama yang sama dengan variabel skrip, variabel skrip
akan digunakan. Jika Anda mengaktifkan alias kolom yang dapat digunakan kembali, alias tersebut akan menyamarkan variabel dalam cakupan kueri.
Contoh berikut mendeklarasikan variabel bernama gross_price yang memiliki nilai default 10.0. Kueri juga menghitung kolom dan memberi alias sebagai
gross_price:
DECLARE gross_price NUMERIC DEFAULT 10.0;
SELECT
net_price * 1.23 AS gross_price,
-- Usage of 'gross_price' here determines the behavior
gross_price * 0.5 AS discounted_gross_price
FROM
product;
Jika Anda tidak mengaktifkan alias kolom yang dapat digunakan kembali, kueri akan menggunakan nilai variabel
10.0. Hasilnya adalah nilai discounted_gross_price dari 5.0 yang merupakan konstanta untuk semua baris. Hasilnya dihitung sebagai 10.0 * 0.5 = 5.0.
Jika Anda mengaktifkan alias kolom yang dapat digunakan kembali, kueri akan menggunakan nilai alias net_price * 1.23. Hasilnya adalah nilai discounted_gross_price yang bervariasi
per baris. Hasilnya dihitung sebagai (net_price * 1.23) * 0.5.
Praktik terbaik
Saat Anda menggunakan alias kolom yang dapat digunakan kembali, pertimbangkan praktik terbaik berikut:
- Sebelum mengaktifkan alias kolom yang dapat digunakan kembali, evaluasi dampaknya terhadap workload yang ada.
- Untuk mencegah perilaku yang tidak diinginkan atau perubahan perilaku yang tidak terlihat (pergeseran semantik), jangan gunakan nama variabel skrip, argumen fungsi, atau kolom dalam kueri luar sebagai nama alias Anda.
- Jika Anda memigrasikan SQL dari dialek sumber yang mendukung semantik alias seperti Teradata atau Snowflake, ikuti petunjuk terjemahan SQL sebelum memulai migrasi.
Memecahkan masalah alias kolom
Contoh berikut menunjukkan cara memecahkan masalah umum terkait alias kolom yang dapat digunakan kembali.
Masalah: Anda mendapatkan hasil kueri yang tidak terduga atau alias tampaknya diabaikan.
Penyelesaian: Verifikasi urutan resolusi nama. Jika tabel Anda berisi kolom dengan nama yang sama dengan alias Anda, nama kolom memiliki prioritas yang lebih tinggi daripada alias. Beri nama unik untuk alias Anda guna menghindari konflik ini.
Error: Column not found.
Penyelesaian: Pastikan Anda tidak menggunakan referensi maju. Anda hanya dapat mereferensikan alias yang ditentukan sebelum penggunaannya. Ini dievaluasi dari kiri ke kanan.
Error: Column name is ambiguous.
Penyelesaian: Pastikan nama alias tidak ditentukan lebih dari sekali dalam daftar SELECT yang sama sebelum direferensikan.
Batasan
Alias kolom yang dapat digunakan kembali tunduk pada batasan berikut:
Jika kueri menyertakan pengelompokan atau agregasi, alias untuk ekspresi yang tidak diagregasi (kolom pengelompokan atau proyeksi kolom pengelompokan) tidak diizinkan dalam klausa
WHEREatau sebagai argumen untuk fungsi agregat. Dalam kueri berikut, aliasbsecara tidak tepat merujuk ke ekspresi yang menyertakana, yang merupakan kolom pengelompokan:SELECT a+1 as b, sum(b) -- sum(b) is invalid. FROM t WHERE b > 5 -- Referencing b under WHERE clause is not allowed. GROUP BY aAlias yang mereferensikan fungsi agregat atau jendela secara langsung atau transitif, tidak dapat digunakan dalam klausa
WHEREatau sebagai argumen untuk fungsi agregat lainnya. Dalam kueri berikut, aliasxmerujuk secara tidak tepat ke fungsi agregat:SELECT sum(a) AS x, sum(x) -- sum(x) is invalid. FROM t WHERE x > 0 -- Referencing x under WHERE clause is not allowed.Menerapkan fungsi jendela pada alias yang merujuk ke fungsi jendela lain secara langsung atau transitif, tidak diizinkan. Dalam kueri berikut, alias
xmengacu pada fungsi jendela yang tidak valid:SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid. FROM tAlias kolom yang dapat digunakan kembali tidak didukung oleh sintaksis pipe.
Alias kolom yang dapat digunakan kembali tidak didukung oleh Graph Query Language (GQL).