Преобразование типов и оператор CAST стр. 3
Есть одна особенность использования оператора CAST в SQL Server, связанная с преобразованием числа к его строковому представлению. Что произойдет, если число символов в числе превышает размер строки? Например,
Консоль
Выполнить
Следует ожидать, что мы получим сообщение об ошибке. Правильно, вот это сообщение:
Arithmetic overflow error converting numeric to data type varchar.
(«Ошибка арифметического переполнения при преобразовании числа к типу данных VARCHAR».)
Естественно, что мы будем ожидать того же сообщения и при выполнении следующего оператора:
Консоль
Выполнить
Но нет. В результате мы получим символ «*» вместо сообщения об ошибке. Мы не беремся судить, с чем это связано, однако, однажды мы столкнулись с проблемой диагностики ошибки в коде, в котором впоследствии выполнялось обратное преобразование к числовому типу.
В нашем простейшем примере это будет выглядеть так:
Консоль
Выполнить
Вот тут-то мы и получаем ошибку:
Syntax error converting the varchar value ‘*’ to a column of data type int.
(«Ошибка синтаксиса при преобразовании значения «*» к типу данных INT».)
Примечание:
Функция Transact-SQL (T-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server и Sybase ASE. Transact-SQL CONVERT ведет себя аналогичным образом.
Преобразование типа money
Денежный тип данных не является стандартным. В SQL Server имеется два денежных типа:
money : диапазон значений от –922,337,203,685,477.5808 до 922,337,203,685,477.5807
smallmoney : диапазон значений от -214 748,3648 до 214 748,3647
Точность обоих типов одна десятитысячная.
Константу типа money можно задать с помощью префикса $, или же использовать преобразование типов, например:
Консоль
Выполнить
[PostgreSQL] Как привести строки в INT и другие типы данных?
Есть база PostgreSQL, в одной из таблиц хранятся смешанные значения (т.е. могут быть как текст, так и цифры, так и что угодно ещё), формат поля — VARCHAR.
В некоторые моменты времени, необходимо выбрать все строки, в которых поле N, например, больше 3, например так: SELECT * FROM table1 WHERE field1 > 3;
Но, тут возникает проблема, т.к. field1 не всегда числовое. Я знаю, что в PostgreSQL есть приведения типов, и запрос должен был бы выглядеть примерно так: SELECT * FROM table1 WHERE field1::INTEGER > 3;
Но, как только приведение доходит до нечислового значения — вылетает с ошибкой, «ошибка синтаксиса».
Подскажите пожалуйста, как правильно составить запрос таким образом, что бы всё что можно было привести к нужному типу — автоматически приводилось бы, а всё что нельзя — просто пропускалось бы, без сравнения/приведения?
- Вопрос задан более трёх лет назад
- 9629 просмотров
Комментировать
Решения вопроса 1
Выбрать только то, что является числом.
SELECT field1::integer FROM table1 WHERE field1 ~ E'^\\d+$' AND field1::integer > 3;
Как перевести string в int sql
Функция CAST имеет следующий синтаксис:
CAST(expression AS type)
CONVERT(expression,type)
где аргумент type представляет один из типов:
Функция CAST() соответствует синтаксису ANSI SQL99, а функция CONVERT() — синтаксису ODBC.
Данная функция приведения типов используется главным образом для создания столбца конкретного типа с помощью команды CREATE . SELECT :
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
Выражение CAST string AS BINARY эквивалентно BINARY string .
Для преобразования строки в числовую величину обычно не нужно ничего делать: просто используйте строку так, как будто это число:
mysql> SELECT 1+'1'; -> 2
MySQL поддерживает арифметические операции с 64-битовыми величинами — как со знаковыми, так и с беззнаковыми. Если используются числовые операции (такие как +) и один из операндов представлен в виде unsigned integer , то результат будет беззнаковым. Его можно переопределить, используя операторы приведения SIGNED и UNSIGNED , чтобы получить 64-битовое целое число со знаком или без знака соответственно.
mysql> SELECT CAST(1-2 AS UNSIGNED) -> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1
Следует учитывать, что если один из операндов представлен величиной с плавающей точкой (в данном контексте DECIMAL() рассматривается как величина с плавающей точкой), результат также является величиной с плавающей точкой и не подчиняется вышеприведенному правилу приведения.
mysql> SELECT CAST(1 AS UNSIGNED) -2.0 -> -1.0
Если в арифметической операции используется строка, то результат преобразуется в число с плавающей точкой.
Функции CAST() и CONVERT() были добавлены в MySQL 4.0.2.
В MySQL 4.0 была изменены правила обработки беззнаковых величин, чтобы обеспечить более полную поддержку величин типа BIGINT . Если код необходимо использовать и для MySQL 4.0, и для версии 3.23 (в которой функция CAST , скорее всего, не будет работать), то можно, применив следующий трюк, получить при вычитании двух беззнаковых целочисленных столбцов результат со знаком:
SELECT (unsigned_column_1+0.0)-(unsigned_column_2+0.0);
Идея состоит в том, что перед выполнением вычитания данные столбцы приводятся к типу с плавающей точкой.
Если возникнут проблемы со столбцами типа UNSIGNED в старых приложениях MySQL при переносе их на MySQL 4.0, можно использовать параметр —sql-mode=NO_UNSIGNED_SUBTRACTION при запуске mysqld . Однако следует учитывать, что при этом теряется возможность эффективного использования столбцов типа UNSIGNED BIGINT .
Как перевести string в int sql
Продвинутый SQL
Когда мы выполняем операции со значениями с разными типами данных, СУБД пытается выполнить преобразование и привести используемые значения к нужному типу. Например, в примере ниже мы сравниваем значения с типами STRING и INT . Чтобы выполнить это сравнение MySQL автоматически сконвертирует строковое значение в числовое.
MySQLSELECT '50' > 49, '50' > 51;
'50' > 49 '50' > 51 1 0 Но не все преобразования СУБД может сделать автоматически, и тогда необходимо делать явное преобразование типов. Для этого в MySQL есть две очень схожие функции CAST и CONVERT .
MySQLCAST(значение AS тип_для_конвертации); CONVERT(значение, тип_для_конвертации);
MySQLSELECT CAST(12005.6 AS DECIMAL), CONVERT(12005.4, DECIMAL);
CAST(12005.6 AS DECIMAL) CONVERT(12005.4, DECIMAL) 12006 12005