Informix 数据库问题
Posted
技术标签:
【中文标题】Informix 数据库问题【英文标题】:Informix Database Issue 【发布时间】:2013-02-11 09:16:59 【问题描述】:我正在使用 informix,但无法在聚合函数中使用 CASE 语句。它总是抛出错误(-201:发生语法错误)。以下是我正在使用的查询。
select nvl(count(case when (ccd.contacttype =1 and ccd.contactdisposition =2) then (ccd.sessionid) else 0 end),'ELSED (att)') as calls
from contactcalldetail ccd
inner join agentconnectiondetail acd on ccd.sessionid=acd.sessionid
你能解释一下出了什么问题吗?
【问题讨论】:
它抛出一个语法错误。 向我们展示确切错误消息。 错误:出现语法错误。错误代码:-201 您使用的是哪个版本的 Informix,您在哪个平台上使用它? 【参考方案1】:Informix 11.70 允许在聚合中使用 CASE
以下 SQL 适用于 Mac OS X 10.7.5 上的 Informix 11.70.FC6(RHEL 5 上的 11.70.FC4):
CREATE TEMP TABLE contactcalldetail
(
contacttype INTEGER NOT NULL,
contactdisposition INTEGER NOT NULL,
sessionid INTEGER NOT NULL
);
CREATE TEMP TABLE agentconnectiondetail
(
sessionid INTEGER NOT NULL
);
SELECT NVL(COUNT(CASE
WHEN (ccd.contacttype = 1 AND ccd.contactdisposition = 2)
THEN (ccd.sessionid)
ELSE 0 END),
'ELSED (att)') AS calls
FROM contactcalldetail ccd
JOIN agentconnectiondetail acd ON ccd.sessionid = acd.sessionid;
Informix 11.50 或更早版本没有
由于它会为您生成 -201 语法错误,我们可以推断您使用的是旧版本的 Informix。这可能意味着您需要升级到更新版本的 Informix。 (根据来自Copilot 的 cmets 的信息,似乎 Informix 11.50 不支持该表示法;只有 11.70 支持。)
如果您使用的是 Informix 11.70,则需要准确记录您使用的版本以及运行它的平台。如果是11.70.xC[4-7],那么我们可能有bug要追;如果它更早,那么可能是在您使用的版本发布后添加了支持。研究发行说明可能有助于理解这一点。我没有检查它什么时候第一次可用。
COUNT 是否曾经返回 NULL?
我观察到我不认为在任何情况下 COUNT 返回 NULL。当然,对于空表,上述查询的以下变体的输出为所有值返回零。因此,我认为 NVL 函数调用是不必要的。
SELECT NVL(COUNT(CASE
WHEN (ccd.contacttype = 1 AND ccd.contactdisposition = 2)
THEN (ccd.sessionid)
ELSE 0 END),
'ELSED (att)') AS calls,
COUNT(*) AS count1,
COUNT(CASE
WHEN (ccd.contacttype = 1 AND ccd.contactdisposition = 2)
THEN (ccd.sessionid)
ELSE 0 END) AS count2
FROM contactcalldetail ccd
JOIN agentconnectiondetail acd ON ccd.sessionid = acd.sessionid;
【讨论】:
【参考方案2】:对我来说似乎是一个 IDS 错误。 我尝试了类似的查询(嵌套在计数函数中的案例),这总是在“when”关键字上给出语法错误。 但是,根据官方documentation 的说法,这应该可以。
【讨论】:
这取决于正在使用的 Informix 服务器的版本。旧版本不支持;当前版本 (11.70.xC7) 应该可以正常工作,如您参考的 11.70 文档中所述。 确实你是对的。我错误地在 11.50 上测试了查询。 11.70,一切正常。 因此,根据您的实验,我们可以合理肯定地说 IDS 11.70 支持嵌套 CASE-inside-aggregate 表示法,但 11.50 和更早的版本不支持。这是有用的信息——谢谢。以上是关于Informix 数据库问题的主要内容,如果未能解决你的问题,请参考以下文章