Проверьте целое число в строковом массиве

Я пытаюсь проверить массив строк на наличие преобразованного целого числа. Это находится внутри процедуры, где:

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

Убедитесь, что вы не столкнетесь с конфликтами имен между параметрами, переменными и именами столбцов! Широко распространенное соглашение заключается в добавлении имен переменных с _ (и никогда не используйте то же самое для имен столбцов). Но в любом случае лучше указывать имена столбцов во всех запросах. Вы не дали понять, что является столбцом, а что является переменной...

Я мог бы еще больше оптимизировать оператор, если бы у меня было полное определение функции и таблицы.

Связанные с:

Другие вопросы по тегам