Проверьте целое число в строковом массиве
Я пытаюсь проверить массив строк на наличие преобразованного целого числа. Это находится внутри процедуры, где:
nc_ecosite
является integer
переменнаяcurrent_consite
это массив строкecosite
является integer
current_ecosite_nc
является double
IF to_char(nc_ecosite, '999') IN
(select current_consite from current_site_record
where current_ecosite_nc::integer = nc_ecosite) THEN
ecosite := nc_ecosite;
Результат всегда исходит от ELSIF
который следует за первым IF
, Это происходит когда nc_ecosite
находится в массиве (из проверок). Почему ecosite
не заселены nc_ecosite
когда значения совпадают?
Я работаю с Postgres 9.3 внутри pgAdmin.
2 ответа
Я нашел следующее, чтобы обеспечить желаемый результат:
IF nc_ecosite in
(select (unnest(string_to_array(current_consite, ',')))::integer
from current_site_record
where current_ecosite_nc::integer = nc_ecosite) THEN
ecosite := nc_ecosite::integer;
Непосредственной причиной проблемы является то, что to_char()
вставляет начальный пробел для вашего заданного шаблона (устаревшие причины - чтобы освободить место для потенциального отрицательного знака). Использовать FM
Модификатор шаблона шаблона, чтобы избежать этого:
to_char(nc_ecosite, 'FM999')
Конечно, для начала было бы лучше работать с соответствующими типами данных - если это вообще возможно.
За исключением этого, я предлагаю это более быстрое и чистое утверждение:
SELECT INTO ecosite nc_ecosite -- variable or column??
WHERE EXISTS (
SELECT 1 FROM current_site_record c
WHERE current_ecosite_nc::integer = nc_ecosite
AND to_char(nc_ecosite, 'FM999') = ANY(current_consite)
);
IF NOT FOUND THEN ... -- to replace your ELSIF
Убедитесь, что вы не столкнетесь с конфликтами имен между параметрами, переменными и именами столбцов! Широко распространенное соглашение заключается в добавлении имен переменных с _
(и никогда не используйте то же самое для имен столбцов). Но в любом случае лучше указывать имена столбцов во всех запросах. Вы не дали понять, что является столбцом, а что является переменной...
Я мог бы еще больше оптимизировать оператор, если бы у меня было полное определение функции и таблицы.
Связанные с: