Фильтровать значения bigint при вставке Postgresql - PullRequest
1 голос
/ 27 февраля 2020

У меня есть 2 таблицы в Postgresql с одинаковой схемой, единственное отличие состоит в том, что в одном из полей идентификатора таблицы есть тип bigint. Схема таблицы, которую мне нужно заполнить данными, выглядит следующим образом:

create table test_int_table(
    id                          int,
    description             text,
    hash_code               int
);

Мне нужно скопировать данные из test_table с идентификатором bigint в publi c .test_int_table. И некоторые из значений, которые превышают диапазон id, должны быть отфильтрованы. Как я могу отслеживать эти значения без жесткого кодирования диапазона? Я могу сделать что-то вроде этого, но я хотел бы создать более общее решение c:

insert into test_int_table
select * from test_table as test
where test.id not between 2147483647 and 9223372036854775808

Под generi c Я имею в виду без ограничений имена столбцов и их количество. Так что в случае, если у меня есть несколько столбцов типа bigint в других таблицах, как я могу отфильтровать все значения их столбцов в общем (без указания имени столбца)?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вы можете сделать что-то вроде этого, если хотите отслеживать:

Создайте функцию, подобную этой:

CREATE OR REPLACE FUNCTION convert_to_integer(v_input bigint)
RETURNS INTEGER AS $$
DECLARE v_int_value INTEGER DEFAULT NULL;
BEGIN
    BEGIN
        v_int_value := v_input::INTEGER;
    EXCEPTION WHEN OTHERS THEN
        RAISE NOTICE 'Invalid integer value: "%".  Returning NULL.', v_input;
        RETURN NULL;
    END;
RETURN v_int_value;
END;
$$ LANGUAGE plpgsql;

и напишите запрос следующим образом:

INSERT INTO test_int_table SELECT * FROM test_table AS t WHERE convert_to_integer(t.id) is not null;

Или вы можете изменить функцию так, чтобы она возвращала 0.

0 голосов
/ 27 февраля 2020

Насколько я могу судить, универсального c решения не существует.

Но я бы написал его как

INSERT INTO test_int_table
SELECT *
FROM test_table AS t
WHERE t.id BETWEEN -2147483647 AND 2147483647;
...