MaxCompute SQL, farklı veri türleri arasında dönüşüm yapılmasına olanak tanır. Bu dönüşümler açık veya örtük olabilir.
Açık dönüşüm
Açık dönüşüm, bir değeri bir veri türünden diğerine dönüştürmek için CAST işlevini kullanır. Aşağıdaki tabloda MaxCompute SQL tarafından desteklenen açık dönüşümler gösterilmektedir. Bu işlev hakkında daha fazla bilgi için bkz. CAST.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bu tabloda Y dönüşümün desteklendiğini, N desteklenmediğini ve N/A dönüşüm gerekmediğini belirtir. Desteklenmeyen bir açık dönüşüm yapmaya çalışmak hata döndürür.
-
Örnek veriler
NotAşağıdaki örneklerde bu örnek verileri içeren bir
usertablosu kullanılmaktadır.create table if not exists user ( user_name string, user_id bigint, age bigint ); insert into user values ('zhangsan',111,20); -
Örnekler
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>));
Kullanım notları ve sınırlamalar
Bir DOUBLE türünü BIGINT türüne dönüştürdüğünüzde ondalık kısım kırpılır. Örneğin,
CAST(1.6 AS BIGINT) = 1.DOUBLE biçimindeki bir STRING'i BIGINT'e dönüştürdüğünüzde değer önce DOUBLE'a ardından BIGINT'e dönüştürülür ve ondalık kısım kırpılır. Örneğin,
CAST("1.6" AS BIGINT) = 1.BIGINT biçimindeki bir STRING'i DOUBLE'a dönüştürebilirsiniz. Sonuçta bir ondalık basamak bulunur. Örneğin,
CAST("1" AS DOUBLE) = 1.0.DATETIME türüne yapılan dönüşümler varsayılan olarak
yyyy-mm-dd hh:mi:ssbiçimini kullanır.Doğrudan açık dönüşümü desteklemeyen bazı veri türlerini dönüştürmek için yerleşik işlevleri kullanabilirsiniz. Örneğin, bir BOOLEAN değerini STRING'e dönüştürmek için
TO_CHARişlevini kullanabilirsiniz. Daha fazla bilgi için bkz. TO_CHAR.TO_DATEişlevi ayrıca bir STRING değerini DATETIME'e dönüştürmeyi de destekler. Daha fazla bilgi için bkz. TO_DATE.Bir DECIMAL'in değer aralığı aşılırsa
CAST STRING TO DECIMALişlemi taşma hatası veya veri kırpılması gibi sorunlara neden olabilir.Bir DECIMAL'i DOUBLE veya FLOAT'a açıkça dönüştürmek hassasiyet kaybına yol açabilir. Para birimi hesaplamaları gibi yüksek hassasiyet gerektiren senaryolar için DECIMAL türünü kullanmanızı öneririz.
-
MaxCompute karmaşık veri türleri için tür dönüşümlerini destekler. Hem örtük hem de açık dönüşümlerde karmaşık bir türün alt türlerinin de dönüştürülebilir olması gerekir. Bir STRUCT'u dönüştürürken alan adlarının eşleşmesi gerekmez ancak alan sayısı aynı olmalı ve karşılık gelen alanlar örtük veya açık olarak dönüştürülebilir olmalıdır. Örnekler:
ARRAY<BIGINT>örtük veya açık olarakARRAY<STRING>türüne dönüştürülebilir.ARRAY<BIGINT>açık olarakARRAY<INT>türüne dönüştürülebilir ancak örtük olarak dönüştürülemez.ARRAY<BIGINT>örtük veya açık olarakARRAY<DATETIME>türüne dönüştürülemez.STRUCT<a:BIGINT,b:INT>örtük olarakSTRUCT<col1:STRING,col2:BIGINT>türüne dönüştürülebilir ancakSTRUCT<a:STRING>türüne örtük veya açık olarak dönüştürülemez.
Örtük dönüşüm ve kapsamı
Örtük dönüşüm, MaxCompute'un bağlama ve dönüşüm kurallarına göre çalışma zamanında otomatik olarak yaptığı bir tür dönüşümüdür. Aşağıdaki tablolarda MaxCompute'un desteklediği örtük dönüşümler gösterilmektedir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bu tablolarda Y dönüşümün desteklendiğini, N desteklenmediğini ve N/A dönüşüm gerekmediğini belirtir. MaxCompute, desteklenmeyen bir örtük dönüşüm veya çalışma zamanında başarısız olan bir dönüşüm için hata döndürür.
MaxCompute 2.0, DECIMAL ve DATETIME türleri için sabit tanımları sunar. Örneğin, 100BD değeri 100 olan bir DECIMAL sabitidir ve
2017-11-11 00:00:00bir DATETIME sabitidir. Bu sabitleri VALUES yan tümcelerinde ve tablolarda doğrudan kullanabilirsiniz.MaxCompute örtük dönüşümleri bağlama göre otomatik olarak yaptığından veri türleri eşleşmediğinde açık dönüşümler için CAST kullanmanızı öneririz.
Örtük dönüşüm kuralları yalnızca belirli bir kapsam içinde etkilidir. Bazı kapsamlarda bu kuralların yalnızca bir alt kümesi uygulanabilir.
Örnek
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;
Örtük dönüşüm kuralları operatöre bağlı olarak değişir:
-
İlişkisel operatörlerle örtük dönüşüm
İlişkisel operatörler şunlardır:
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE, and IN.LIKE, RLIKE, and INiçin örtük dönüşüm kuralları diğer ilişkisel operatörlerden farklıdır ve ayrı olarak açıklanmıştır. Bu bölümdeki kurallar bu üç operatör için geçerli değildir.Bir ilişkisel işlemde farklı veri türleri söz konusu olduğunda bunlar aşağıdaki kurallara göre örtük olarak dönüştürülür.
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/ANotKarşılaştırılan iki veri türü örtük olarak dönüştürülemiyorsa ilişkisel işlem başarısız olur ve hata döndürür.
İlişkisel operatörler hakkında daha fazla bilgi için bkz. Operators.
-
Özel ilişkisel operatörlerle örtük dönüşüm
Özel ilişkisel operatörler şunlardır:
LIKE, RLIKE, and IN.-
LIKE ve RLIKE sözdizimi şu şekildedir:
source LIKE pattern; source RLIKE pattern;NotLIKE ve RLIKE için source ve pattern parametreleri STRING türünde olmalıdır.
Diğer veri türlerine izin verilmez ve bu işlem için örtük olarak STRING'e dönüştürülmez.
-
IN sözdizimi şu şekildedir:
key IN (value1, value2, …)NotBir IN ifadesinde değer listesindeki tüm değerler aynı veri türünde olmalıdır.
Anahtar değerlerle karşılaştırıldığında türler BIGINT, DOUBLE ve STRING içeriyorsa hepsini DOUBLE'a dönüştürmenizi öneririz. Türler DATETIME ve STRING içeriyorsa hepsini DATETIME'e dönüştürmenizi öneririz. Başka tür dönüşümlerine izin verilmez.
-
-
Aritmetik operatörlerle örtük dönüşüm
Aritmetik operatörler şunlardır:
+, -, *, /, and %. Bunların örtük dönüşüm kuralları şöyledir:Aritmetik işlemlerde yalnızca STRING, BIGINT, DOUBLE ve DECIMAL türleri kullanılabilir.
STRING değerler işlem öncesi örtük olarak DOUBLE'a dönüştürülür.
BIGINT, DOUBLE ile yapılan hesaplamalarda örtük olarak DOUBLE'a dönüştürülür.
DATETIME ve BOOLEAN türleri aritmetik işlemlerde kullanılamaz.
-
Mantıksal operatörlerle örtük dönüşüm
Mantıksal operatörler şunlardır:
and, or, and not. Bunların örtük dönüşüm kuralları şöyledir:Mantıksal işlemlerde yalnızca BOOLEAN değerler kullanılabilir.
Diğer veri türleri mantıksal işlemlerde kullanılamaz ve bu amaçla örtük olarak dönüştürülemez.
Yerleşik işlevlerde örtük dönüşüm
MaxCompute SQL, herhangi bir satırdaki bir veya daha fazla sütun üzerinde hesaplama yapmak ve çeşitli veri türleri döndürmek için geniş bir yerleşik işlev yelpazesi sağlar. Bunların örtük dönüşüm kuralları şöyledir:
Bir işlevi çağırdığınızda bir giriş parametresinin veri türü o parametre için tanımlanan türle eşleşmiyorsa parametre gerekli türe örtük olarak dönüştürülür.
MaxCompute SQL'deki her yerleşik işlev için örtük dönüşüm kuralları farklıdır .
CASE WHEN ifadelerinde örtük dönüşüm
CASE WHEN ifadeleri hakkında daha fazla bilgi için bkz. CASE WHEN expression. Örtük dönüşüm kuralları şöyledir:
Dönüş türleri yalnızca BIGINT ve DOUBLE içeriyorsa tümü DOUBLE'a dönüştürülür.
Olası herhangi bir dönüş değeri STRING ise tüm dönüş değerleri STRING'e dönüştürülür. BOOLEAN gibi dönüştürülemeyen bir tür varsa hata döndürülür.
Başka tür dönüşümlerine izin verilmez.
STRING ve DATETIME dönüşümü
MaxCompute, STRING ve DATETIME türleri arasında dönüşümleri destekler. Bu dönüşümler için yyyy-mm-dd hh:mi:ss biçimi kullanılır.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bir birim değeri tek basamaklıysa baştaki sıfır atlanamaz. Örneğin,
2014-1-9 12:12:12geçersiz bir DATETIME biçimidir ve STRING'den DATETIME'e dönüştürülemez. Bunu2014-01-09 12:12:12şeklinde yazmalısınız.Bir STRING yalnızca dize yukarıda açıklanan biçimle eşleşiyorsa DATETIME'e dönüştürülebilir. Örneğin,
CAST("2013-12-31 02:34:34" AS DATETIME)ifadesi2013-12-31 02:34:34STRING'ini DATETIME türüne dönüştürür. Benzer şekilde, bir DATETIME değeri STRING'e dönüştürüldüğünde varsayılan olarakyyyy-mm-dd hh:mi:ssbiçimini kullanır.
MaxCompute, varsayılan tarih biçimiyle eşleşmeyen STRING değerlerini DATETIME türüne dönüştürmenize olanak tanıyan TO_DATE işlevini sağlar. Daha fazla bilgi için bkz. TO_DATE.