#sql #netezza
#sql #netezza
Вопрос:
У меня есть запрос, который я пишу, который проверяет поле идентификатора и извлекает идентификационный номер из этого столбца на основе нескольких критериев. Теперь, когда у меня есть написанная логика, я хочу выполнить запрос по каждому критерию, чтобы увидеть, работает ли логика. Итак, последняя часть моего запроса для этого выглядит следующим образом:
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’.
Моя проблема, когда я запускаю это, заключается в том, что я возвращаю ошибку «Недопустимая позиция». Я удалил одну из строк из критериев, и это работает. Итак, я решил добавить второе в свое собственное предложение «НЕ В …» с AND между ними, но это привело к той же ошибке.
Если бы мне пришлось угадывать, 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. Заранее спасибо!
Ответ №1:
Я понял, в чем проблема — при выполнении
STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-4)
Некоторые из этих идентификаторов расположения не содержат 4 символов, поэтому я получал «Недопустимую позицию». Я исправил это, обновив этот запрос, чтобы вместо него использовать substring():
SUBSTRING(SOURCE_ARRANGEMENT_ID,5,LENGTH(SOURCE_ARRANGEMENT_ID))
Это устранило мою проблему. Просто хотел опубликовать ответ на случай, если у других возникнет эта проблема. Это не специфично для Netezza, это будет реагировать таким образом с любым вариантом SQL.