приведение строки к целому числу - Postgres


123

Я импортирую данные из таблицы, которая имеет необработанные каналы в Varchar, мне нужно импортировать столбец в varchar в строковый столбец. Я попытался использовать <column_name>::integerтакже, to_number(<column_name>,'9999999')но получаю ошибки, так как есть несколько пустых полей, мне нужно получить их как пустые или пустые в новую таблицу.

Пожалуйста, дайте мне знать, есть ли для этого функция.


5
Не могли бы вы показать нам сообщение об ошибке? Это поможет
— Фрэнк Хайкенс,

Ответы:


126

Дикая догадка: если ваше значение - пустая строка, вы можете использовать NULLIF, чтобы заменить ее на NULL:

SELECT
    NULLIF(your_value, '')::int

56

Вы даже можете пойти еще дальше и ограничить это объединенное поле, например: -

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 

28

Если вам нужно обрабатывать пустые столбцы как NULLs, попробуйте следующее:

SELECT CAST(nullif(<column>, '') AS integer);

С другой стороны, если у вас есть NULLзначения, которых следует избегать, попробуйте:

SELECT CAST(coalesce(<column>, '0') AS integer);

Я согласен, сообщение об ошибке очень поможет.


25

Единственный способ избежать ошибки из-за NULL, специальных символов или пустой строки - это сделать следующее:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table

2
Для меня (9.6.2) это было единственное, что сработало, все остальные ответы не помогли.
— Jasper de Vries

2
Не могли бы вы добавить WHERE <column> != NULL?
— Matthieu

14

Я не могу комментировать (слишком низкая репутация? Я новичок) к сообщению Лукаса.

На моем PG настройка to_number(NULL)не работает, поэтому мое решение будет:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table

1
Это должно сработать, но это должен быть точный эквивалент менее подробного NULLIF()подхода. Стандарт фактически определяет NULLIF как форму предиката CASE.
— kgrittn

13

Если значение содержит нечисловые символы, вы можете преобразовать значение в целое число следующим образом:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

Оператор CASE проверяет <столбец>, если он соответствует целочисленному шаблону, он преобразует скорость в целое число, в противном случае возвращает 0



1

Общая проблема

Наивно введите преобразование любой строки в целое число, например

SELECT ''::integer

Часто приводит к известной ошибке:

Query failed: ERROR: invalid input syntax for integer: ""

проблема

В PostgreSQL нет предопределенной функции для безопасного преобразования любой строки в целое число.

Решение

Создайте пользовательскую функцию, вдохновленную функцией PHP intval () .

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

использование

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.