Что вы здесь говорите:
and table2.status not in (code);
- это то же самое, что сказать:
and table2.status <> code;
Вы не говорите:
and table2.status not in ('232/232','34fd/34//');
Причина в том, что он проверяет status
против всего code
, а не какой-то части code
. Разделенный запятыми список в code
не анализируется. На самом деле никакие переменные не анализируются. Они взяты целыми. Если вам нужно несколько значений в предикате in
, вам нужно либо несколько литеральных значений, либо несколько переменных, либо некоторая их комбинация.
Он работает для вставки, потому что он просто вставляет все значение code
в столбец table1
. Разбор не требуется.
Другой вариант, так как вы находитесь в процедуре, это самостоятельно разобрать список, разделенный запятыми, в массив строк (не собираюсь показывать вам это здесь), а затем использовать производную таблицу коллекции, чтобы преобразовать массив в таблицу, которая вы можете использовать в предикате in
вот так:
status not in (select s.string from UNNEST(stringArray) as s(string))