MaxCompute SQL mendukung konversi tipe data, baik secara eksplisit maupun implisit.
Konversi Eksplisit
Konversi eksplisit menggunakan fungsi CAST untuk mengubah tipe data suatu nilai. Tabel berikut menjelaskan aturan konversi eksplisit yang didukung oleh MaxCompute SQL. Untuk informasi lebih lanjut tentang fungsi CAST, lihat CAST.
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 |
Y menunjukkan bahwa konversi didukung. N menunjukkan bahwa konversi tidak didukung. N/A menunjukkan bahwa konversi tidak diperlukan. Jika dilakukan konversi eksplisit yang tidak didukung, kesalahan akan dikembalikan.
Contoh
CatatanData dalam tabel
userdigunakan dalam topik ini.create table if not exists user ( user_name string, user_id bigint, age bigint ); insert into user values ('zhangsan',111,20);Kode 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>));
Petunjuk dan Batasan
Jika nilai tipe DOUBLE dikonversi menjadi tipe BIGINT, digit setelah titik desimal dihapus. Sebagai contoh, Anda dapat menjalankan
CAST(1.6 AS BIGINT) = 1untuk mengonversi 1.6 dari tipe DOUBLE menjadi 1 dari tipe BIGINT.Jika nilai tipe STRING yang sesuai dengan format tipe DOUBLE dikonversi menjadi tipe BIGINT, nilai tersebut dikonversi dari tipe STRING ke tipe DOUBLE, lalu ke tipe BIGINT. Selama konversi, digit setelah titik desimal dihapus. Sebagai contoh, Anda dapat menjalankan
CAST("1.6" AS BIGINT) = 1untuk mengonversi 1.6 dari tipe STRING menjadi 1 dari tipe BIGINT.Jika nilai tipe STRING yang sesuai dengan format tipe BIGINT dikonversi menjadi tipe DOUBLE, satu digit dipertahankan setelah titik desimal. Sebagai contoh, Anda dapat menjalankan
CAST("1" AS DOUBLE) = 1.0untuk mengonversi 1 dari tipe STRING menjadi 1.0 dari tipe DOUBLE.Format default
yyyy-mm-dd hh:mi:ssdigunakan selama konversi yang melibatkan tipe DATETIME.Tipe data tertentu tidak dapat dikonversi secara eksplisit, tetapi dapat dikonversi menggunakan fungsi bawaan SQL. Sebagai contoh, Anda dapat menggunakan fungsi
TO_CHARuntuk mengonversi tipe BOOLEAN menjadi tipe STRING. Untuk informasi lebih lanjut, lihat TO_CHAR. Anda juga dapat menggunakan fungsiTO_DATEuntuk mengonversi tipe STRING menjadi tipe DATETIME. Untuk informasi lebih lanjut, lihat TO_DATE.Jika nilai melebihi rentang nilai tipe DECIMAL, kesalahan mungkin terjadi selama eksekusi
CAST STRING TO DECIMAL. Sebagai contoh, overflow pada bit paling signifikan atau penghapusan bit paling tidak signifikan mungkin terjadi.Konversi dari tipe DECIMAL ke tipe DOUBLE atau FLOAT mengakibatkan hilangnya presisi. Dalam skenario yang memerlukan presisi tinggi, seperti perhitungan jumlah tagihan atau laju premi, disarankan untuk mempertahankan tipe DECIMAL.
MaxCompute mendukung konversi tipe data kompleks. Konversi implisit antara tipe data kompleks hanya dapat diimplementasikan jika subtipe mereka mendukung konversi implisit. Konversi eksplisit antara tipe data kompleks hanya dapat diimplementasikan jika subtipe mereka mendukung konversi eksplisit. Jika Anda mengonversi tipe STRUCT, nama bidang dapat tidak konsisten, tetapi jumlah bidang harus konsisten dan bidang-bidang ini harus mendukung konversi implisit atau eksplisit. Contoh:
MaxCompute dapat mengonversi secara implisit atau eksplisit nilai tipe
BIGINTmenjadi nilai tipeSTRING.MaxCompute dapat mengonversi secara eksplisit nilai tipe
BIGINTmenjadi nilai tipeINT. Konversi implisit tidak didukung.MaxCompute tidak dapat mengonversi secara implisit atau eksplisit nilai tipe
BIGINTmenjadi nilai tipeDATETIME.MaxCompute dapat mengonversi nilai STRUCT<a:BIGINT,b:INT> menjadi nilai
STRUCT<col1:STRING,col2:BIGINT>secara implisit. Namun, MaxCompute tidak mendukung konversi, baik implisit maupun eksplisit, dari nilaiSTRUCT<a:BIGINT,b:INT>menjadi nilaiSTRUCT<a:STRING>.
Konversi Implisit dan Ruang Lingkup Aplikasinya
Konversi implisit memungkinkan MaxCompute untuk secara otomatis mengonversi tipe data berdasarkan konteks dan aturan yang telah ditentukan. Tabel berikut menjelaskan aturan konversi implisit yang didukung oleh MaxCompute.
Dari/Ke | 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 |
Dari/Ke | 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/A | N/A |
TIMESTAMP | N | N | Y | Y | N/A | N |
BINARY | N | N | N | N | N | N/A |
Y menunjukkan bahwa konversi didukung. N menunjukkan bahwa konversi tidak didukung. N/A menunjukkan bahwa konversi tidak diperlukan. Kesalahan akan dikembalikan jika konversi implisit yang tidak didukung dilakukan atau jika konversi gagal.
MaxCompute V2.0 memperkenalkan metode untuk mendefinisikan konstanta tipe DECIMAL dan DATETIME. Sebagai contoh, 100BD menunjukkan nilai 100 dari tipe DECIMAL.
2017-11-11 00:00:00menunjukkan konstanta tipe DATETIME. Konstanta dapat langsung didefinisikan dalam klausa VALUES dan tabel.Jika konversi implisit digunakan, MaxCompute secara otomatis mengonversi tipe data berdasarkan konteks. Jika tipe tidak cocok, Anda dapat menggunakan fungsi CAST untuk secara eksplisit mengonversi tipe data.
Aturan konversi implisit berlaku untuk ruang lingkup tertentu. Dalam skenario tertentu, hanya sebagian aturan yang berlaku.
Contoh
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;Konversi implisit dengan operator yang berbeda:
Konversi implisit dengan operator relasional
Operator relasional meliputi
=, <>, <, ≤, >, ≥, IS NULL, IS NOT NULL, LIKE, RLIKE, dan IN. Aturan yang menggunakanLIKE, RLIKE, dan INberbeda dari aturan yang menggunakan operator relasional lainnya. Aturan yang dijelaskan dalam bagian ini tidak berlaku untuk ketiga operator tersebut.Tabel berikut menjelaskan aturan konversi implisit saat data dari tipe yang berbeda digunakan untuk operasi relasional.
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
CatatanJika dua nilai yang ingin Anda bandingkan tidak mendukung konversi implisit, operasi relasional tidak dapat diselesaikan dan kesalahan akan dikembalikan.
Untuk informasi lebih lanjut tentang operator relasional, lihat Operator.
Konversi implisit dengan operator relasional khusus
Operator relasional khusus meliputi
LIKE, RLIKE, dan IN.Sintaksis LIKE dan RLIKE
source LIKE pattern; source RLIKE pattern;CatatanParameter source dan pattern dari LIKE dan RLIKE harus bertipe STRING.
Tipe lain tidak dapat terlibat dalam operasi atau secara implisit dikonversi menjadi tipe STRING.
Sintaksis IN
key IN (value1, value2, ...)CatatanTipe data dalam daftar nilai setelah IN harus konsisten.
Jika tipe data nilai mencakup BIGINT, DOUBLE, dan STRING, konversikan nilai tipe BIGINT dan STRING menjadi tipe DOUBLE. Jika tipe data nilai mencakup DATETIME dan STRING, konversikan nilai tipe STRING menjadi tipe DATETIME. Konversi antara tipe data lainnya tidak diperbolehkan.
Konversi implisit dengan operator aritmatika
Operator aritmatika meliputi:
+, -, *, /, dan %. Aturan berikut berlaku untuk konversi implisit dengan operator-operator ini.Hanya nilai tipe STRING, BIGINT, DOUBLE, dan DECIMAL yang dapat digunakan untuk operasi aritmatika.
Nilai tipe STRING secara implisit dikonversi menjadi tipe DOUBLE sebelum operasi aritmatika.
Jika nilai tipe BIGINT dan DOUBLE digunakan untuk operasi aritmatika, nilai tipe BIGINT secara implisit dikonversi menjadi tipe DOUBLE.
Nilai tipe DATETIME dan BOOLEAN tidak dapat digunakan untuk operasi aritmatika.
Konversi implisit dengan operator logika
Operator logika meliputi
AND, OR, dan NOT. Aturan berikut berlaku untuk konversi implisit dengan operator-operator ini:Hanya nilai tipe BOOLEAN yang dapat digunakan untuk operasi logika.
Nilai tipe lain tidak dapat digunakan untuk operasi logika atau dikonversi secara implisit.
Konversi Implisit dengan Fungsi Bawaan
MaxCompute SQL menyediakan berbagai fungsi bawaan. Fungsi-fungsi ini dapat digunakan untuk menghitung satu atau beberapa kolom baris tertentu dan memberikan data dari tipe tertentu. Aturan berikut berlaku untuk konversi implisit dengan fungsi-fungsi ini:
Jika Anda memanggil fungsi bawaan dan tipe data parameter input berbeda dari yang didefinisikan dalam fungsi, tipe data parameter input dikonversi menjadi tipe data yang didefinisikan oleh fungsi.
Parameter setiap fungsi bawaan di MaxCompute SQL memiliki persyaratan berbeda untuk konversi implisit.
Konversi Implisit dengan CASE WHEN
Untuk informasi lebih lanjut tentang CASE WHEN, lihat Ekspresi CASE WHEN. Aturan berikut berlaku untuk konversi implisit dengan CASE WHEN:
Jika nilai pengembalian adalah tipe BIGINT dan DOUBLE, semua nilai dikonversi menjadi tipe DOUBLE.
Jika nilai pengembalian mencakup tipe STRING, semua nilai dikonversi menjadi tipe STRING. Jika konversi, seperti konversi dari BOOLEAN ke STRING gagal, kesalahan akan dikembalikan.
Konversi antara tipe data lainnya tidak diperbolehkan.
Konversi antara Tipe STRING dan DATETIME
MaxCompute mendukung konversi antara tipe STRING dan DATETIME. Format yyyy-mm-dd hh:mi:ss digunakan selama konversi.
Unit waktu | String (tidak peka huruf besar-kecil) | Nilai valid |
Tahun | yyyy | 0001 - 9999 |
Bulan | mm | 01 - 12 |
Hari | dd | 01 - 28|29|30|31 |
Jam | hh | 00 - 23 |
Menit | mi | 00 - 59 |
Detik | ss | 00 - 59 |
Jika digit pertama rentang nilai setiap unit waktu adalah 0, 0 tidak boleh dihilangkan. Sebagai contoh,
2014-1-9 12:12:12adalah format DATETIME yang tidak valid dan tidak dapat dikonversi dari tipe STRING menjadi tipe DATETIME. Harus ditulis sebagai2014-01-09 12:12:12.Hanya tipe STRING yang memenuhi persyaratan format di atas yang dapat dikonversi menjadi tipe DATETIME. Sebagai contoh,
CAST("2013-12-31 02:34:34" AS DATETIME)mengonversi2013-12-31 02:34:34dari tipe STRING menjadi tipe DATETIME. Demikian pula, jika Anda mengonversi nilai tipe DATETIME menjadi nilai tipe STRING, nilai setelah konversi secara otomatis direpresentasikan dalam formatyyyy-mm-dd hh:mi:ss.
MaxCompute menyediakan fungsi TO_DATE untuk mengonversi tipe STRING yang tidak sesuai dengan format tipe DATETIME menjadi tipe DATETIME. Untuk informasi lebih lanjut, lihat TO_DATE.