MaxCompute SQL mendukung dua bentuk konversi tipe: konversi eksplisit menggunakan fungsi CAST dan konversi implisit, di mana MaxCompute secara otomatis mengonversi tipe berdasarkan konteks.
Konversi eksplisit
Fungsi CAST mengonversi nilai dari satu tipe data ke tipe data lainnya. Untuk detail sintaksis, lihat CAST.
Tabel berikut menunjukkan konversi eksplisit yang didukung. Y = didukung, N = tidak didukung, N/A = tidak berlaku.
| Dari\Ke | BIGINT | DOUBLE | STRING | DATETIME | BOOLEAN | DECIMAL | FLOAT |
|---|---|---|---|---|---|---|---|
| BIGINT | N/A | Y | Y | N | Y | Y | Y |
| DOUBLE | Y | N/A | Y | N | Y | Y | Y |
| STRING | Y | Y | N/A | Y | Y | Y | Y |
| DATETIME | N | N | Y | N/A | N | N | N |
| BOOLEAN | Y | Y | Y | N | N/A | Y | Y |
| DECIMAL | Y | Y | Y | N | Y | N/A | Y |
| FLOAT | Y | Y | Y | N | Y | Y | N/A |
Upaya melakukan konversi yang tidak didukung akan menghasilkan error.
Perilaku dan batasan konversi
Konversi numerik
| Konversi | Perilaku | Contoh |
|---|---|---|
| DOUBLE → BIGINT | Bagian desimal dipotong, bukan dibulatkan | CAST(1.6 AS BIGINT) → 1 |
| STRING (format DOUBLE) → BIGINT | STRING dikonversi → DOUBLE → BIGINT; bagian desimal dipotong | CAST('1.6' AS BIGINT) → 1 |
| STRING (format BIGINT) → DOUBLE | Satu tempat desimal ditambahkan | CAST('1' AS DOUBLE) → 1.0 |
Konversi DATETIME
Konversi yang melibatkan DATETIME menggunakan format yyyy-mm-dd hh:mi:ss. Angka nol di depan wajib digunakan: 2014-01-09 12:12:12 valid; 2014-1-9 12:12:12 tidak valid.
Konversi DECIMAL
Mengonversi STRING ke DECIMAL menghasilkan error jika nilainya melebihi rentang DECIMAL—misalnya, jika digit paling signifikan overflow atau digit paling tidak signifikan terpotong.
Mengonversi DECIMAL ke DOUBLE atau FLOAT menyebabkan kehilangan presisi. Untuk perhitungan finansial seperti Tagihan atau laju premi, pertahankan nilai dalam DECIMAL.
Konversi yang tidak didukung oleh CAST
Beberapa pasangan tipe tidak dapat dikonversi dengan CAST, tetapi dapat ditangani dengan fungsi bawaan:
| Konversi | Fungsi alternatif |
|---|---|
| BOOLEAN → STRING | TO_CHAR |
| STRING (format non-standar) → DATETIME | TO_DATE |
Konversi tipe kompleks
Konversi antar tipe kompleks (ARRAY, STRUCT) mengikuti aturan konversi tipe elemen atau bidangnya:
Konversi implisit antar tipe kompleks hanya didukung jika subtipe-nya mendukung konversi implisit.
Konversi eksplisit antar tipe kompleks hanya didukung jika subtipe-nya mendukung konversi eksplisit.
Untuk tipe STRUCT, nama bidang boleh berbeda, tetapi jumlah bidang harus sama dan setiap pasangan bidang harus mendukung konversi yang diperlukan.
| Konversi | Implisit | Eksplisit |
|---|---|---|
| BIGINT → STRING | Y | Y |
| BIGINT → INT | N | Y |
| BIGINT → DATETIME | N | N |
STRUCT<a:BIGINT, b:INT> → STRUCT<col1:STRING, col2:BIGINT> | Y | Y |
STRUCT<a:BIGINT, b:INT> → STRUCT<col1:STRING> (jumlah bidang tidak sesuai) | N | N |
Contoh
Contoh berikut menggunakan tabel user. Untuk membuat tabel dan memasukkan data sampel, jalankan:
CREATE TABLE IF NOT EXISTS user (
user_name STRING,
user_id BIGINT,
age BIGINT
);
INSERT INTO user VALUES ('zhangsan', 111, 20);-- Mengonversi kolom BIGINT ke DOUBLE
SELECT CAST(user_id AS DOUBLE) AS new_id FROM user;
-- Mengonversi literal string ke DATETIME
SELECT CAST('2015-10-01 00:00:00' AS DATETIME) AS new_date;
-- Mengonversi array integer ke array string
SELECT CAST(ARRAY(1, 2, 3) AS ARRAY<STRING>);
-- Menggabungkan array string menjadi string yang dipisahkan koma
SELECT CONCAT_WS(',', CAST(ARRAY(1, 2) AS ARRAY<STRING>));Konversi implisit
MaxCompute secara otomatis mengonversi tipe data berdasarkan konteks. Tabel berikut menunjukkan konversi implisit yang didukung. Y = didukung, N = tidak didukung, N/A = tidak berlaku.
Tipe integer dan floating-point
| Dari\Ke | BOOLEAN | TINYINT | SMALLINT | INT | BIGINT | FLOAT |
|---|---|---|---|---|---|---|
| BOOLEAN | Y | N | N | N | N | N |
| TINYINT | N | Y | Y | Y | Y | Y |
| SMALLINT | N | N | Y | Y | Y | Y |
| INT | N | N | Y | Y | Y | Y |
| BIGINT | N | N | N | N | Y | Y |
| FLOAT | N | N | N | N | Y | Y |
Tipe decimal dan string
| Dari\Ke | DOUBLE | DECIMAL | STRING | VARCHAR | TIMESTAMP | BINARY |
|---|---|---|---|---|---|---|
| DOUBLE | Y | Y | Y | Y | N | N |
| DECIMAL | N | Y | Y | Y | N | N |
| STRING | Y | Y | Y | Y | N | N |
| VARCHAR | Y | Y | N | N | N/A | N/A |
| TIMESTAMP | N | N | Y | Y | Y | N |
| BINARY | N | N | N | N | N | Y |
Upaya melakukan konversi implisit yang tidak didukung atau konversi yang gagal saat waktu proses akan menghasilkan error.
MaxCompute 2.0 memperkenalkan konstanta bertipe untuk DECIMAL dan DATETIME. Misalnya,
100BDadalah konstanta DECIMAL dengan nilai 100, dan2017-11-11 00:00:00adalah konstanta DATETIME. Konstanta ini dapat digunakan langsung dalam klausa VALUES dan tabel.Saat tipe tidak cocok dalam suatu ekspresi, gunakan
CASTuntuk mengonversi secara eksplisit daripada mengandalkan konversi implisit.Aturan konversi implisit berlaku pada konteks tertentu. Dalam beberapa situasi, hanya sebagian aturan yang berlaku.
Contoh
SELECT user_id + age + '12345', CONCAT(user_name, user_id, age) FROM user;Dalam kueri ini, '12345' dikonversi secara implisit ke DOUBLE untuk ekspresi aritmetika, sedangkan user_id dan age dikonversi secara implisit ke STRING untuk CONCAT.
Konversi implisit dengan operator relasional
Operator relasional mencakup =, <>, <, <=, >, >=, IS NULL, dan IS NOT NULL. Tabel berikut menunjukkan cara MaxCompute menyelesaikan ketidaksesuaian tipe dalam perbandingan relasional. Nilai sel menunjukkan tipe yang digunakan untuk mengonversi kedua operan.
| Dari\Ke | BIGINT | DOUBLE | STRING | DATETIME | BOOLEAN | DECIMAL |
|---|---|---|---|---|---|---|
| BIGINT | N/A | DOUBLE | DOUBLE | N | N | DECIMAL |
| DOUBLE | DOUBLE | N/A | DOUBLE | N | N | DECIMAL |
| STRING | DOUBLE | DOUBLE | N/A | DATETIME | N | DECIMAL |
| DATETIME | N | N | DATETIME | N/A | N | N |
| BOOLEAN | N | N | N | N | N/A | N |
| DECIMAL | DECIMAL | DECIMAL | DECIMAL | N | N | N/A |
Jika kedua operan tidak mendukung konversi implisit, perbandingan akan gagal dengan error. Untuk informasi lebih lanjut tentang operator relasional, lihat Operators.
Konversi implisit dengan LIKE, RLIKE, dan IN
LIKE, RLIKE, dan IN mengikuti aturan yang berbeda dari operator relasional lainnya.
LIKE dan RLIKE
source LIKE pattern;
source RLIKE pattern;Baik source maupun pattern harus bertipe STRING. Tipe lain tidak dapat digunakan dan tidak dikonversi secara implisit ke STRING.
IN
key IN (value1, value2, ...)Semua nilai dalam daftar harus memiliki tipe yang sama. Saat daftar berisi tipe campuran, MaxCompute menerapkan konversi berikut:
Jika daftar berisi nilai BIGINT, DOUBLE, dan STRING, maka BIGINT dan STRING dikonversi ke DOUBLE.
Jika daftar berisi nilai DATETIME dan STRING, maka STRING dikonversi ke DATETIME.
Kombinasi tipe lain tidak didukung.
Konversi implisit dengan operator aritmetika
Operator aritmetika mencakup +, -, *, /, dan %.
Hanya nilai BIGINT, DOUBLE, DECIMAL, dan STRING yang dapat digunakan dalam ekspresi aritmetika.
STRING dikonversi secara implisit ke DOUBLE sebelum operasi dilakukan.
Saat BIGINT dan DOUBLE muncul dalam ekspresi yang sama, BIGINT dikonversi ke DOUBLE.
DATETIME dan BOOLEAN tidak dapat digunakan dalam ekspresi aritmetika.
Konversi implisit dengan operator logika
Operator logika mencakup AND, OR, dan NOT. Hanya nilai BOOLEAN yang dapat digunakan dalam ekspresi logika. Tipe lain tidak dikonversi secara implisit.
Konversi implisit dengan fungsi bawaan
Saat fungsi bawaan menerima argumen yang tipenya berbeda dari tipe parameter yang diharapkan, MaxCompute secara implisit mengonversi argumen tersebut ke tipe yang diharapkan. Setiap fungsi bawaan menentukan sendiri persyaratan konversi implisitnya.
Konversi implisit dengan CASE WHEN
Untuk informasi lebih lanjut tentang CASE WHEN, lihat CASE WHEN expression.
Saat cabang THEN dan ELSE mengembalikan tipe yang berbeda, MaxCompute menyelesaikannya sebagai berikut:
BIGINT dan DOUBLE → semua cabang dikonversi ke DOUBLE.
Salah satu cabang mengembalikan STRING → semua cabang dikonversi ke STRING. Jika suatu cabang tidak dapat dikonversi (misalnya, BOOLEAN ke STRING), error akan dikembalikan.
Kombinasi tipe lain tidak didukung.
Konversi antara STRING dan DATETIME
Konversi antara STRING dan DATETIME menggunakan format yyyy-mm-dd hh:mi:ss. Rentang valid untuk setiap komponen adalah:
| Komponen | Format | Rentang valid |
|---|---|---|
| Tahun | yyyy | 0001–9999 |
| Bulan | mm | 01–12 |
| Hari | dd | 01–28/29/30/31 |
| Jam | hh | 00–23 |
| Menit | mi | 00–59 |
| Kedua | ss | 00–59 |
Angka nol di depan wajib digunakan. Misalnya, 2014-1-9 12:12:12 tidak valid; tulis sebagai 2014-01-09 12:12:12.
-- Valid: mengonversi string ke DATETIME
SELECT CAST('2013-12-31 02:34:34' AS DATETIME);
-- Mengonversi DATETIME ke STRING menghasilkan format yyyy-mm-dd hh:mi:ss secara otomatisUntuk mengonversi STRING yang tidak mengikuti format ini, gunakan TO_DATE.
Upaya konversi seperti berikut akan gagal dan menyebabkan exception.
CAST("2013/12/31 02/34/34" AS DATETIME)
CAST("20131231023434" AS DATETIME)
CAST("2013-12-31 2:34:34" AS DATETIME)Nilai maksimum untuk komponen hari bergantung pada jumlah hari aktual dalam bulan yang ditentukan. Jika nilainya melebihi jumlah hari dalam bulan tersebut, exception akan terjadi.
CAST("2013-02-29 12:12:12" AS DATETIME) -- Exception dikembalikan. Februari 2013 tidak memiliki 29 hari.
CAST("2013-11-31 12:12:12" AS DATETIME) -- Exception dikembalikan. November 2013 tidak memiliki 31 hari.