SQL WHERE 子句中的位置无效

Invalid Position in SQL WHERE Clause

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

FROM TABLE1
WHERE SOURCE_SYSTEM_NM = 'XYZ' AND ((STRLEFT(SOURCE_ARRANGEMENT_ID,4)) NOT IN ('23CC','21CC'))
LIMIT 10000 

基本上我在这里要做的是告诉它 return 只有 SOURCE_SYSTEM_NM 等于 'XYZ' 的项目,同时消除任何 SOURCE_ARRANGEMENT_ID前 4 个字符不等于“21CC”或“23CC”。我还有第三个要过滤的条件,即前三个字符必须是“0CC”。

我的问题是 运行 这是我返回 "Invalid Position" 错误。我从条件中删除了其中一个字符串,它起作用了。因此,我决定在其自己的 '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 derived/created 正确。我需要向下过滤以获得上面最后一个 WHEN 语句的结果,但我在最后的 WHERE 语句中一直得到 "Invalid Position" 。我正在使用 Aginity 运行 此查询,它针对 IBM Netezza 数据库 运行ning。提前致谢!

我在执行时弄清楚了这个问题是什么

STRRIGHT(SOURCE_ARRANGEMENT_ID, LENGTH(SOURCE_ARRANGEMENT_ID)-4)

有些 Arrangement ID 没有 4 个字符,因此我得到了 "Invalid Position"。我通过更新此查询以改用 substring() 来解决此问题:

SUBSTRING(SOURCE_ARRANGEMENT_ID,5,LENGTH(SOURCE_ARRANGEMENT_ID))

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