我正在编写一个查询,该查询将检查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数据库运行。预先感谢!
答案 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变体以这种方式做出反应。