приведение строки к целому числу - 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.