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 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 perhitungan, seperti gross_price. Anda dapat mereferensikan alias gross_price langsung di klausa WHERE, bukan mengulangi perhitungan di 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 perhitungan yang bersih, ringkas, dari kiri ke kanan tanpa mengulangi ekspresi yang kompleks atau menggabungkan kueri dalam subkueri.
- Keterbacaan yang ditingkatkan: analis dan developer dapat mendeklarasikan ekspresi sekali, lalu menggunakannya kembali secara langsung. 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 tingkat project, gunakan pernyataan ALTER PROJECT SET OPTIONS.
Untuk menetapkan opsi konfigurasi ini, Anda memerlukan peran Admin BigQuery (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, nilai 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-<code><var>REGION</var></code>.reusable_column_aliases_mode` = "on"
);
Ganti REGION dengan region Anda.
Untuk mengaktifkan alias kolom yang dapat digunakan kembali di tingkat project, masukkan pernyataan DDL berikut:
ALTER PROJECT <code><var>PROJECT_ID</var></code>
SET OPTIONS (
`region-<code><var>REGION</var></code>.reusable_column_aliases_mode` = "on"
);
Ganti kode berikut:
- REGION: region Anda.
- PROJECT_ID: project ID Anda.
Memeriksa apakah alias kolom diaktifkan atau dinonaktifkan
Anda dapat memeriksa apakah alias kolom yang dapat digunakan kembali diaktifkan atau dinonaktifkan di tingkat project atau organisasi dengan membuat kueri tampilan skema informasi berikut:
Untuk mengetahui informasi selengkapnya tentang cara menggunakan tampilan skema informasi, lihat Pengantar
ke 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: Memfilter berdasarkan kolom kalkulasi yang ditentukan dalam daftar SELECT. - Klausa
SELECT: Menggunakan alias kalkulasi 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 perhitungan lain yang Anda tentukan sebelumnya dalam daftar SELECT. Kueri ini juga menunjukkan cara mereferensikan alias di 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 yang 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 perhitungan, 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 jika 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 alias kolom yang dapat digunakan kembali diaktifkan, alias akan "menutupi" 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 dalam 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 akan 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 akan 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 akan 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 akan menutupi variabel dalam cakupan kueri.
Contoh berikut mendeklarasikan variabel bernama gross_price yang memiliki nilai default 10.0. Kueri ini juga menghitung kolom dan mengaliasinya 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 sebesar 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 menggunakan alias kolom yang dapat digunakan kembali, pertimbangkan praktik terbaik berikut:
- Sebelum mengaktifkan alias kolom yang dapat digunakan kembali, evaluasi dampaknya pada 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 pemberian alias seperti Teradata atau Snowflake, ikuti SQL petunjuk terjemahan 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 akan memiliki prioritas yang lebih tinggi daripada alias. Beri alias Anda nama yang unik untuk menghindari konflik ini.
Error: Column not found.
Penyelesaian: Pastikan Anda tidak menggunakan referensi penerusan. Anda hanya dapat mereferensikan alias yang ditentukan sebelum penggunaannya. Hal 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 ke ekspresi yang tidak diagregasi (kolom pengelompokan atau proyeksi kolom pengelompokan) tidak diizinkan dalam klausa
WHEREatau sebagai argumen ke 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 ke fungsi agregat lainnya. Dalam kueri berikut, aliasxsecara tidak tepat merujuk 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.Penerapan fungsi jendela ke alias yang mereferensikan fungsi jendela lain secara langsung atau transitif, tidak diizinkan. Dalam kueri berikut, alias
xmerujuk ke 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 pipa.
Alias kolom yang dapat digunakan kembali tidak didukung oleh Graph Query Language (GQL).