У меня есть запрос, который я пишу, который проверяет поле идентификатора и выводит идентификационный номер из этого столбца на основе нескольких критериев. Теперь, когда у меня написана его логика, я хочу запустить запрос по каждому критерию, чтобы увидеть, работает ли логика. Итак, последняя часть моего запроса для этого выглядит следующим образом:
FROM TABLE1
WHERE SOURCE_SYSTEM_NM = 'XYZ' AND ((STRLEFT(SOURCE_ARRANGEMENT_ID,4)) NOT IN ('23CC','21CC'))
LIMIT 10000
По сути, то, что я пытаюсь сделать здесь, это сказать, чтобы он возвращал мне только элементы с SOURCE_SYSTEM_NM, равным «XYZ», при этом удаляя все элементы с SOURCE_ARRANGEMENT_ID, первые 4 символа которых не равны «21CC» или «23CC». У меня есть третий критерий, по которому я также хочу отфильтровать: первые три символа должны быть «0CC».
Моя проблема, когда я запускаю это, я возвращаю ошибку «Неверная позиция». Я удалил одну из строк из критериев, и она работает. Итак, я решил добавить второе в его собственное предложение «НЕ В...» с И между ними, но это привело к той же ошибке.
Если бы мне пришлось угадывать, NOT IN ('21CC','23CC') ставит между ними И, и я думаю, что это должно быть корнем моей проблемы. Критерии в моем заявлении CASE получают идентификационный номер со следующим:
WHEN (M_CRF_CU_PRODUCT_ARRANGEMENT.SOURCE_SYSTEM_NM) IN ('XYZ') AND STRLEFT(SOURCE_ARRANGEMENT_ID, 4) IN ('23CC','21CC') THEN STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-4)
WHEN (M_CRF_CU_PRODUCT_ARRANGEMENT.SOURCE_SYSTEM_NM) IN ('XYZ') AND STRLEFT(SOURCE_ARRANGEMENT_ID, 3) IN ('0CC') THEN STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-3)
WHEN (M_CRF_CU_PRODUCT_ARRANGEMENT.SOURCE_SYSTEM_NM) IN ('XYZ') AND (STRLEFT(SOURCE_ARRANGEMENT_ID, 4) NOT IN ('23CC','21CC') OR STRLEFT(SOURCE_ARRANGEMENT_ID, 3) NOT IN ('0CC')) THEN (SOURCE_ARRANGEMENT_ID)
Таким образом, я просто пытаюсь проверить каждый критерий, чтобы убедиться, что полученный/созданный идентификатор верен. Мне нужно отфильтровать, чтобы получить результаты для этого последнего оператора WHEN выше, но я продолжаю получать эту «Неверную позицию» в моем операторе WHERE в конце. Я использую Aginity для выполнения этого запроса, и он работает с базой данных IBM Netezza. Заранее спасибо!


Я разобрался в чем тут дело - при выполнении
STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-4)
Некоторые из этих идентификаторов аранжировки не имеют 4 символов, поэтому я получал «Неверную позицию». Я исправил это, обновив этот запрос, чтобы вместо этого использовать substring():
SUBSTRING(SOURCE_ARRANGEMENT_ID,5,LENGTH(SOURCE_ARRANGEMENT_ID))
Это исправило мою проблему. Просто хотел опубликовать ответ на случай, если у других возникнет эта проблема. Это не специфично для Netezza, это будет реагировать таким образом на любой вариант SQL.