为啥我的查询因 SQLCODE = -420 而失败?
Posted
技术标签:
【中文标题】为啥我的查询因 SQLCODE = -420 而失败?【英文标题】:Why is my query failing with SQLCODE = -420?为什么我的查询因 SQLCODE = -420 而失败? 【发布时间】:2020-01-23 15:25:58 【问题描述】:我能得到一些帮助吗?我将复制代码以及错误。我查了错误代码
(DB2 SQL 错误:SQLCODE=-420,SQLSTATE=22018,SQLERRMC=BOOLEAN)
但我不明白什么不符合功能要求?我只是想把这些表拉出来,当满足一定要求时重命名ACH_ORIGINATION.DESCRIPTION,然后过滤掉不满足要求的。我也想按说明分组,但我想先让这部分工作。
SELECT
ACH_ORIGINATION.COMPANY_SERIAL,
ACH_ORIGINATION.NAME,
ACH_ORIGINATION.AMOUNT,
ACH_ORIGINATION.NEXT_POSTING_DATE,
CASE ACH_ORIGINATION.DESCRIPTION
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%J & J%' THEN 'J & J Electric'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%DeCleene%' THEN 'DeCleene'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Arab%' THEN 'Arab'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Clifford%' THEN 'Clifford Signs'
ELSE 'Nothing'
END AS DESCRIPTION
FROM
CORE.ACH_ORIGINATION AS ACH_ORIGINATION
WHERE
ACH_ORIGINATION.NEXT_POSTING_DATE IS NOT NULL AND
DESCRIPTION <> 'Nothing'
错误:
net.sf.jasperreports.engine.JRException:net.sf.jasperreports.engine.JRRuntimeException:net.sf.jasperreports.engine.JRException:执行 SQL 语句时出错:ACH32Origination32Report_TableDataset_1579792666108_134237 在 com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:466) 在 com.jaspersoft.studio.editor.preview.view.control.ReportControler.access 18 美元(ReportControler.java:441) 在 com.jaspersoft.studio.editor.preview.view.control.ReportControler$4.run(ReportControler.java:333) 在 org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) 原因:net.sf.jasperreports.engine.JRRuntimeException:net.sf.jasperreports.engine.JRException:执行 SQL 语句时出错:ACH32Origination32Report_TableDataset_1579792666108_134237 在 net.sf.jasperreports.engine.fill.JRFillSubreport.prepare(JRFillSubreport.java:809) 在 net.sf.jasperreports.components.table.fill.FillTableSubreport.prepareSubreport(FillTableSubreport.java:156) 在 net.sf.jasperreports.components.table.fill.FillTable.prepare(FillTable.java:400) 在 net.sf.jasperreports.engine.fill.JRFillComponentElement.prepare(JRFillComponentElement.java:151) 在 net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:332) 在 net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:384) 在 net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:358) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillSummaryNoLastFooterSamePage(JRVerticalFiller.java:1102) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillSummary(JRVerticalFiller.java:1065) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:329) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:159) 在 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963) 在 net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:120) 在 java.lang.Thread.run(未知来源) 原因:net.sf.jasperreports.engine.JRException:执行 SQL 语句时出错:ACH32Origination32Report_TableDataset_1579792666108_134237 在 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:240) 在 net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1114) 在 net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:691) 在 net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1314) 在 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:931) 在 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873) 在 net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:665) 在 net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59) 在 net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.run(AbstractThreadSubreportRunner.java:203) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) ... 1 更多 原因:com.ibm.db2.jcc.am.SqlDataException:DB2 SQL 错误:SQLCODE=-420,SQLSTATE=22018,SQLERRMC=BOOLEAN,DRIVER=4.13.127 在 com.ibm.db2.jcc.am.id.a(id.java:669) 在 com.ibm.db2.jcc.am.id.a(id.java:60) 在 com.ibm.db2.jcc.am.id.a(id.java:127) 在 com.ibm.db2.jcc.am.bo.b(bo.java:4101) 在 com.ibm.db2.jcc.am.bo.a(bo.java:4083) 在 com.ibm.db2.jcc.t4.cb.a(cb.java:835) 在 com.ibm.db2.jcc.t4.cb.n(cb.java:801) 在 com.ibm.db2.jcc.t4.cb.j(cb.java:253) 在 com.ibm.db2.jcc.t4.cb.d(cb.java:55) 在 com.ibm.db2.jcc.t4.q.c(q.java:44) 在 com.ibm.db2.jcc.t4.sb.j(sb.java:147) 在 com.ibm.db2.jcc.am.no.kb(no.java:2112) 在 com.ibm.db2.jcc.am.oo.b(oo.java:4407) 在 com.ibm.db2.jcc.am.oo.fc(oo.java:743) 在 com.ibm.db2.jcc.am.oo.executeQuery(oo.java:713) 在 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:233) ... 11 更多
【问题讨论】:
您正在混合语法,case colum when value
或 case when condition
case
表达式语法...只需执行case when ...
。
感谢cmets,我知道现在哪里出错了。
【参考方案1】:
每个 cmets,像这样修复 CASE 表达式:
CASE WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%J & J%' THEN 'J & J Electric'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%DeCleene%' THEN 'DeCleene'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Arab%' THEN 'Arab'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Clifford%' THEN 'Clifford Signs'
ELSE 'Nothing'
END AS DESCRIPTION
【讨论】:
划掉我之前关于它们都被标记为“无”的评论——它现在似乎工作正常,但是,现在我正在尝试按描述分组,所以我遇到了一个错误。我所做的只是在 WHERE 子句之后添加 GROUP BY DESCRIPTION,现在我得到 DB2 SQL 错误:SQLCODE= -119, SQLSTATE=42803, SQLERRMC=NEXT_POSTING_DATE, DRIVER=3.58.82。【参考方案2】:其实还是发个新问题比较好,如果你原来的问题解决了,现在又遇到了新问题...GROUP BY
的多个问题。您可以运行下面的查询来使用表达式。
1) 您必须在GROUP BY
列表中未显示但在SELECT
列表中使用的列上使用一些聚合函数。如果取消注释已注释掉的第一行,并注释掉下一行(使用MAX
函数),则会得到 SQLCODE=-119。
2) GROUP BY
子句中的意外/错误表达式。
您应该在group by
子句中使用相同的case
表达式,而不是原来的DESCRIPTION
列。如果您取消注释已注释掉的--DESCRIPTION
行并注释掉GROUP BY
列表中的CASE
表达式,您可能会“突然”意识到,您在DESCRIPTION
列中获得了两个具有相同值的组。这是因为您先按DESCRIPTION
中的原始值分组,然后再处理CASE
表达式中的分组值。
SELECT
--ACH_ORIGINATION.NEXT_POSTING_DATE,
MAX(ACH_ORIGINATION.NEXT_POSTING_DATE) AS NEXT_POSTING_DATE,
CASE
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%J & J%' THEN 'J & J Electric'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%DeCleene%' THEN 'DeCleene'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Arab%' THEN 'Arab'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Clifford%' THEN 'Clifford Signs'
ELSE 'Nothing'
END AS DESCRIPTION
, COUNT(1) CNT
FROM
(
VALUES
(CURRENT DATE - 1, 'Arab1')
, (CURRENT DATE - 2, 'Arab2')
) ACH_ORIGINATION (NEXT_POSTING_DATE, DESCRIPTION)
WHERE
ACH_ORIGINATION.NEXT_POSTING_DATE IS NOT NULL AND
DESCRIPTION <> 'Nothing'
GROUP BY
--DESCRIPTION
CASE
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%J & J%' THEN 'J & J Electric'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%DeCleene%' THEN 'DeCleene'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Arab%' THEN 'Arab'
WHEN ACH_ORIGINATION.DESCRIPTION LIKE '%Clifford%' THEN 'Clifford Signs'
ELSE 'Nothing'
END
;
【讨论】:
以上是关于为啥我的查询因 SQLCODE = -420 而失败?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Bluemix dashDB 操作会引发 SQLCODE=-1667 的 SqlSyntaxErrorException?
为啥这个 PySide2 构建找不到生成的 C++ 包装器?
在查询的任何表中都找不到列 ( )(或 SLV 未定义)。 SQLCODE=-217
SQL 查询的准备语句,错误 DB2 SQL 错误:SQLCODE=-206,SQLSTATE=42703
为什么我在执行以下查询时遇到错误SQLCODE = -204,SQLSTATE = 42704,DRIVER = 4.18.60