DuneSQLは、数値および文字列の値を可能であれば適切な型に暗黙的に変換します。
DuneSQLは、文字型と数値型の間で暗黙的に変換することはありません。
例えば、VARCHAR
を期待するクエリは、BIGINT
値を自動的に同等のVARCHAR
に変換しません。
必要に応じて、cast関数を使用して値を特定の型に明示的にキャストできます。
DuneSQLは、INT256
およびUINT256
と他の数値型(INTEGER
、BIGINTEGER
、DECIMAL
、DOUBLE
)との操作で暗黙的キャストをサポートしています。これにより、INT256
およびUINT256
を使用する際に明示的にキャストを追加する必要がなくなります。
DuneSQLがINT256
またはUINT256
と他の数値型の共通の型を見つける必要がある場合、一般的に大きい方の型を選択します。
INT256
はUINT256
よりも大きいと見なされます。このため、INT256
とUINT256
の値を同じ式に含めようとすると、オーバーフローエラーが発生する可能性があります。
TINYINT
、SMALLINT
、INTEGER
、BIGINT
、および小数点以下の桁数が0のDECIMAL
型(例:DECIMAL(2,0)
)は、INT256
またはUINT256
に変換されます。UINT256
への変換の一部は、この型が負の値を保持できないため失敗します。
INT256
またはUINT256
と小数点以下の桁数が0でないDECIMAL
型(例:DECIMAL(2,1)
)との操作の場合、結果の型はDOUBLE
になります。また、INT256
またはUINT256
とREAL
またはDOUBLE
型との操作の場合も、結果の型はDOUBLE
になります。DOUBLE
は近似数値型であるため、変換により精度が失われることがあります。DuneSQLの変換規則を上書きするには、明示的なキャストを使用できます。
暗黙的変換では、この算術式:
SELECT 2 * UINT256 '1';
は次の式と同等になります:
SELECT CAST(2 AS UINT256) * UINT256 '1';
同様に、この比較式:
SELECT INT256 '1' > 0;
は次の式と同等になります:
SELECT INT256 '1' > CAST(0 AS INT256);
DuneSQLは他の多くのコンテキストでも暗黙的コンバージョンを使用します。
以下はその例です:
SELECT COALESCE(1, INT256 '2');
-- INT256に解決されます
SELECT CASE
WHEN false THEN BIGINT '0'
WHEN false THEN INT256 '1'
WHEN true THEN UINT256 '2'
END;
-- INT256に解決されます