набір рядка до цілого числа - 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) це було єдиним, що спрацювало, всі інші відповіді не змогли.
Джаспер де Вріс

2
Не могли ви додати WHERE <column> != NULL?
Матьє

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 не має попередньо визначеної функції для безпечного введення будь-якого рядка в ціле число.

Рішення

Створіть визначену користувачем функцію, натхненну функцією intval () PHP .

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.