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

123

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

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

Виджей DJ
источник
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);

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

vyegorov
источник
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
Niko
источник
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

вы можете использовать этот запрос

SUM(NULLIF(conversion_units, '')::numeric)
Абдул Квадир
источник
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
Абель Кальехо
источник