Множество типов разрешенные для преобразования в конструкции CAST AS определяется реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)], char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer]. А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со множеством записей в массивы.
-- MySQLselect CAST('5.3' AS decimal)+2select CAST( (select '5.3') AS decimal(6,2))+2.0 -- Oracleselect CAST('5,22' AS double precision) +2 from dual -- PostgreSQLselect CAST('5.22' AS double precision) +2 В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть собственный более удобный оператор преобразования типов ::.
select cast('tru' as boolean);select cast('fa' as boolean);-- ошибка, строка не похожа на 'true', 'false' -- и не равна строкам '1' или '0'select cast('ok' as boolean) -- создадим функцию преобразования-- просто указываем какие строки-- понимать как true значение,-- все остальные строки будут false значениемCREATE OR REPLACE FUNCTION to_bool(varchar) RETURNS booleanAS $$ SELECT $1 = 'true' or $1 = 'tru' or $1 = 'tr' or $1 = 't' or $1 = '1' or $1='ok'$$LANGUAGE SQL; -- создаем преобразование типа varchar в booleanCREATE CAST (varchar AS boolean) WITH FUNCTION to_bool(varchar) AS ASSIGNMENT; -- теперь можно такselect cast ( 'ok'::varchar as boolean);select cast( varchar 'ok' as boolean); select 'ok'::varchar::boolean; -- уничтожение преобразованияDROP CAST IF EXISTS (varchar AS boolean) ;
В большинстве случае необходимо преобразование в строку либо из строки. Для этого случая СУБД предоставляют дополнительные функции.