MaxCompute SQL mendukung konversi antar berbagai tipe data, baik secara eksplisit maupun implisit.
Konversi eksplisit
Konversi eksplisit menggunakan fungsi CAST untuk mengubah nilai dari satu tipe data ke tipe data lain. Tabel berikut menunjukkan konversi eksplisit yang didukung oleh MaxCompute SQL. Untuk informasi lebih lanjut tentang fungsi ini, lihat CAST.
From/to | 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 |
Pada tabel tersebut, Y menunjukkan bahwa konversi didukung, N menunjukkan bahwa konversi tidak didukung, dan N/A berarti konversi tidak diperlukan. Melakukan konversi eksplisit yang tidak didukung akan menghasilkan error.
data sampel
CatatanContoh berikut menggunakan tabel
userdengan data sampel ini.create table if not exists user ( user_name string, user_id bigint, age bigint ); insert into user values ('zhangsan',111,20);Contoh
SELECT CAST(user_id AS DOUBLE) AS new_id from user; SELECT CAST('2015-10-01 00:00:00' AS DATETIME) AS new_date; SELECT CAST(ARRAY(1,2,3) AS ARRAY<STRING>); SELECT CONCAT_WS(',', CAST(ARRAY(1, 2) AS ARRAY<STRING>));
Catatan penggunaan dan keterbatasan
Saat mengonversi tipe DOUBLE ke tipe BIGINT, bagian pecahan dipotong. Contohnya,
CAST(1.6 AS BIGINT) = 1.Saat mengonversi STRING dalam format DOUBLE ke BIGINT, nilai tersebut terlebih dahulu dikonversi ke DOUBLE lalu ke BIGINT, dengan bagian pecahan dipotong. Contohnya,
CAST("1.6" AS BIGINT) = 1.STRING dalam format BIGINT dapat dikonversi ke DOUBLE. Hasilnya memiliki satu tempat desimal. Contohnya,
CAST("1" AS DOUBLE) = 1.0.Konversi ke tipe DATETIME menggunakan format default
yyyy-mm-dd hh:mi:ss.Anda dapat menggunakan fungsi bawaan untuk mengonversi beberapa tipe data yang tidak mendukung konversi eksplisit langsung. Misalnya, gunakan fungsi
TO_CHARuntuk mengonversi nilai BOOLEAN ke STRING. Untuk informasi lebih lanjut, lihat TO_CHAR. FungsiTO_DATEjuga mendukung konversi nilai STRING ke DATETIME. Untuk informasi lebih lanjut, lihat TO_DATE.Jika rentang nilai DECIMAL dilampaui,
CAST STRING TO DECIMALdapat menyebabkan masalah seperti error overflow atau pemotongan data.Mengonversi DECIMAL secara eksplisit ke DOUBLE atau FLOAT dapat mengakibatkan kehilangan presisi. Untuk skenario presisi tinggi, seperti perhitungan mata uang, disarankan menggunakan tipe DECIMAL.
MaxCompute mendukung konversi tipe untuk tipe data kompleks. Baik untuk konversi implisit maupun eksplisit pada tipe kompleks, subtipe-nya juga harus dapat dikonversi. Saat mengonversi STRUCT, nama bidang tidak harus sesuai, tetapi jumlah bidang harus sama dan bidang yang bersesuaian harus dapat dikonversi secara implisit atau eksplisit. Contohnya:
ARRAY<BIGINT>dapat dikonversi secara implisit atau eksplisit keARRAY<STRING>.ARRAY<BIGINT>dapat dikonversi secara eksplisit keARRAY<INT>tetapi tidak dapat dikonversi secara implisit.ARRAY<BIGINT>tidak dapat dikonversi secara implisit maupun eksplisit keARRAY<DATETIME>.STRUCT<a:BIGINT,b:INT>dapat dikonversi secara implisit keSTRUCT<col1:STRING,col2:BIGINT>tetapi tidak dapat dikonversi secara implisit maupun eksplisit keSTRUCT<a:STRING>.
Konversi implisit dan cakupannya
Konversi implisit adalah konversi tipe yang dilakukan MaxCompute secara otomatis pada waktu proses berdasarkan konteks dan aturan konversi. Tabel berikut menunjukkan konversi implisit yang didukung oleh MaxCompute.
From/To | BOOLEAN | TINYINT | SMALLINT | INT | BIGINT | FLOAT |
BOOLEAN | N/A | N | N | N | N | N |
TINYINT | N | N/A | Y | Y | Y | Y |
SMALLINT | N | N | N/A | Y | Y | Y |
INT | N | N | Y | N/A | Y | Y |
BIGINT | N | N | N | N | N/A | Y |
FLOAT | N | N | N | N | Y | N/A |
From/to | DOUBLE | DECIMAL | STRING | VARCHAR | TIMESTAMP | BINARY |
DOUBLE | N/A | Y | Y | Y | N | N |
DECIMAL | N | N/A | Y | Y | N | N |
STRING | Y | Y | N/A | Y | N | N |
VARCHAR | Y | Y | Y | N/A | N | N |
TIMESTAMP | N | N | Y | Y | N/A | N |
BINARY | N | N | N | N | N | N/A |
Pada tabel-tabel tersebut, Y menunjukkan bahwa konversi didukung, N menunjukkan bahwa konversi tidak didukung, dan N/A berarti konversi tidak diperlukan. MaxCompute mengembalikan error untuk konversi implisit yang tidak didukung atau konversi yang gagal pada waktu proses.
MaxCompute 2.0 memperkenalkan definisi konstanta untuk tipe DECIMAL dan DATETIME. Contohnya, 100BD adalah konstanta DECIMAL dengan nilai 100, dan
2017-11-11 00:00:00adalah konstanta DATETIME. Anda dapat menggunakan konstanta ini langsung dalam klausa VALUES dan tabel.Karena MaxCompute melakukan konversi implisit secara otomatis berdasarkan konteks, disarankan menggunakan CAST untuk konversi eksplisit ketika tipe data tidak sesuai.
Aturan konversi implisit hanya berlaku dalam cakupan tertentu. Dalam beberapa cakupan, hanya sebagian dari aturan ini yang berlaku.
Contoh
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;Aturan konversi implisit bervariasi tergantung pada operator:
Konversi implisit dengan operator relasional
Operator relasional mencakup
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE, dan IN. Aturan konversi implisit untukLIKE, RLIKE, dan INberbeda dari operator relasional lainnya dan dijelaskan secara terpisah. Aturan dalam bagian ini tidak berlaku untuk ketiga operator tersebut.Saat tipe data berbeda terlibat dalam operasi relasional, mereka dikonversi secara implisit sesuai aturan berikut.
From/to
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
CatatanJika dua tipe data yang dibandingkan tidak dapat dikonversi secara implisit, operasi relasional gagal dan mengembalikan error.
Untuk informasi lebih lanjut tentang operator relasional, lihat Operators.
Konversi implisit dengan operator relasional khusus
Operator relasional khusus mencakup
LIKE, RLIKE, dan IN.Sintaks untuk LIKE dan RLIKE adalah sebagai berikut:
source LIKE pattern; source RLIKE pattern;CatatanParameter source dan pattern untuk LIKE dan RLIKE harus bertipe STRING.
Tipe data lain tidak diizinkan dan tidak dikonversi secara implisit ke STRING untuk operasi ini.
Sintaks untuk IN adalah sebagai berikut:
key IN (value1, value2, …)CatatanDalam ekspresi IN, semua nilai dalam daftar nilai harus memiliki tipe data yang sama.
Saat key dibandingkan dengan nilai-nilai tersebut, jika tipe-tipe tersebut mencakup BIGINT, DOUBLE, dan STRING, disarankan mengonversi semuanya ke DOUBLE. Jika tipe-tipe tersebut mencakup DATETIME dan STRING, disarankan mengonversi semuanya ke DATETIME. Konversi tipe lain tidak diizinkan.
Konversi implisit dengan operator aritmetika
Operator aritmetika mencakup
+, -, *, /, dan %. Aturan konversi implisitnya adalah sebagai berikut:Hanya tipe STRING, BIGINT, DOUBLE, dan DECIMAL yang dapat digunakan dalam operasi aritmetika.
Nilai STRING dikonversi secara implisit ke DOUBLE sebelum operasi.
BIGINT dikonversi secara implisit ke DOUBLE saat digunakan dalam perhitungan dengan DOUBLE.
Tipe DATETIME dan BOOLEAN tidak dapat digunakan dalam operasi aritmetika.
Konversi implisit dengan operator logika
Operator logika mencakup
and, or, dan not. Aturan konversi implisitnya adalah sebagai berikut:Hanya nilai BOOLEAN yang dapat digunakan dalam operasi logika.
Tipe data lain tidak dapat digunakan dalam operasi logika dan tidak dapat dikonversi secara implisit untuk tujuan ini.
Konversi implisit dalam fungsi bawaan
MaxCompute SQL menyediakan berbagai fungsi bawaan untuk melakukan perhitungan pada satu atau beberapa kolom dari baris apa pun dan mengembalikan berbagai tipe data. Aturan konversi implisitnya adalah sebagai berikut:
Saat memanggil fungsi, jika tipe data parameter input tidak sesuai dengan tipe yang ditentukan untuk parameter tersebut, parameter tersebut dikonversi secara implisit ke tipe yang diperlukan.
Aturan konversi implisit bervariasi untuk setiap fungsi bawaan dalam MaxCompute SQL.
Konversi implisit dalam ekspresi CASE WHEN
Untuk informasi lebih lanjut tentang ekspresi CASE WHEN, lihat CASE WHEN expression. Aturan konversi implisitnya adalah sebagai berikut:
Jika tipe kembali hanya mencakup BIGINT dan DOUBLE, semuanya dikonversi ke DOUBLE.
Jika ada nilai kembali potensial yang bertipe STRING, semua nilai kembali dikonversi ke STRING. Jika suatu tipe, seperti BOOLEAN, tidak dapat dikonversi, error dikembalikan.
Konversi tipe lain tidak diizinkan.
Konversi STRING dan DATETIME
MaxCompute mendukung konversi antara tipe STRING dan DATETIME. Format yyyy-mm-dd hh:mi:ss digunakan untuk konversi ini.
Unit | Format string | Value range |
Year | yyyy | 0001-9999 |
Month | mm | 01-12 |
Day | dd | 01-28|29|30|31 |
Hour | hh | 00-23 |
Minute | mi | 00-59 |
Second | ss | 00-59 |
Jika nilai unit berupa digit tunggal, nol di depan tidak boleh dihilangkan. Contohnya,
2014-1-9 12:12:12adalah format DATETIME yang tidak valid dan tidak dapat dikonversi dari STRING ke DATETIME. Anda harus menulisnya sebagai2014-01-09 12:12:12.STRING dapat dikonversi ke DATETIME hanya jika string tersebut sesuai dengan format yang dijelaskan di atas. Contohnya,
CAST("2013-12-31 02:34:34" AS DATETIME)mengonversi STRING2013-12-31 02:34:34ke tipe DATETIME. Demikian pula, saat nilai DATETIME dikonversi ke STRING, format default-nya adalahyyyy-mm-dd hh:mi:ss.
MaxCompute menyediakan fungsi TO_DATE, yang memungkinkan Anda mengonversi nilai STRING yang tidak sesuai dengan format tanggal default ke tipe DATETIME. Untuk informasi lebih lanjut, lihat TO_DATE.