Неверная позиция в предложении SQL WHERE - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть запрос, который я пишу, который проверяет поле идентификатора и выводит номер идентификатора из этого столбца на основе нескольких критериев. Теперь, когда у меня написана логика, я хочу выполнить запрос по каждому критерию, чтобы проверить, работает ли логика. Итак, последняя часть моего запроса для этого выглядит следующим образом:

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') ставит между ними AND, и я думаю, что это должно быть корнем моей проблемы. Критерии в моей инструкции 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 Ответ

0 голосов
/ 08 мая 2019

Я выяснил, в чем проблема - при выполнении

STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-4)

Есть некоторые из тех идентификаторов расположения, которые не имеют 4 символа, таким образом, я получаю «Неверную позицию».Я исправил это, обновив этот запрос, чтобы вместо него использовать substring ():

SUBSTRING(SOURCE_ARRANGEMENT_ID,5,LENGTH(SOURCE_ARRANGEMENT_ID))

Это исправило мою проблему.Просто хотел опубликовать ответ в случае, если другие имеют эту проблему.Это не специфично для Netezza, так будет реагировать любой вариант SQL.

...