SQL WHERE子句中的无效位置

时间:2019-04-18 17:24:10

标签: sql netezza

我正在编写一个查询,该查询将检查ID字段,并根据多个条件从该列中获取ID号。现在,我已经编写了逻辑,现在我想在每个条件上运行查询,以查看逻辑是否有效。因此,查询的最后一部分如下:

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不具有前四个字符等于“ 21CC”或“ 23CC”的项目。我还有一个要过滤的第三个条件,即前三个字符必须为“ 0CC”。

运行此程序时,我遇到的问题是返回“无效位置”错误。我从条件中删除了一个字符串,它可以工作。因此,我决定在其自己的“ NOT IN ...”子句中添加第二个,并且在它们之间添加一个AND,但这导致了相同的错误。

如果我不得不猜测,NOT IN ('21CC','23CC')在它们之间插入一个AND,我认为那一定是我问题的根源。我的CASE语句中的条件使用以下内容得出ID号:

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)

因此,我只是尝试检查每个条件以确保派生/创建的ID是正确的。我需要过滤以获得上述最后一个WHEN语句的结果,但最后我仍会在我的WHERE语句中获得该“无效位置”。我正在使用Aginity运行此查询,并且它针对IBM Netezza数据库运行。预先感谢!

1 个答案:

答案 0 :(得分:0)

我弄清楚了问题所在-执行时

STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-4)

有些排列ID没有4个字符,因此我得到了“无效位置”。我通过更新此查询以使用substring()来解决此问题:

SUBSTRING(SOURCE_ARRANGEMENT_ID,5,LENGTH(SOURCE_ARRANGEMENT_ID))

这解决了我的问题。只是想发布答案,以防其他人遇到此问题。它不是特定于Netezza的,这将对任何SQL变体以这种方式做出反应。