【问题标题】:coldfusion count case error depending on datasource取决于数据源的冷融合计数案例错误
【发布时间】:2014-10-21 12:53:20
【问题描述】:

我正在使用coldfusion 使用COUNT CASE 语句从数据库中检索一些值。

下面的 SQL 对 SQL 服务器数据源非常有效:

<cfquery name="getData" datasource="cfTSP1_Dev">
  SELECT  SiteFK,
      Scheme,
      COUNT(case when DrawingTypeFK = 'Civil' then 1 else null end) as CCount,
      COUNT(case when DrawingTypeFK = 'Mechanical' then 1 else null end) as MCount,
      COUNT(case when DrawingTypeFK = 'Electrical' then 1 else null end) as ECount,
      COUNT(case when DrawingTypeFK = 'P & ID' then 1 else null end) as PCount,
      COUNT(case when DrawingTypeFK = 'Zoning' then 1 else null end) as ZCount
  FROM     Drawings.tblDrawingsData
  where     SiteFK = 'MYSITE'
  group by  SiteFK,Scheme
  order by Scheme

但是当我将查询更改为指向 access 数据库中完全相同的表时,我收到错误:

<cfquery name="getData" datasource="drawingsLink">
  SELECT  SiteFK,
      Scheme,
      COUNT(case when DrawingTypeFK = 'Civil' then 1 else null end) as CCount,
      COUNT(case when DrawingTypeFK = 'Mechanical' then 1 else null end) as MCount,
      COUNT(case when DrawingTypeFK = 'Electrical' then 1 else null end) as ECount,
      COUNT(case when DrawingTypeFK = 'P & ID' then 1 else null end) as PCount,
      COUNT(case when DrawingTypeFK = 'Zoning' then 1 else null end) as ZCount
  FROM     tblDrawingsData
  where     SiteFK = 'MYSITE'
  group by  SiteFK,Scheme
  order by Scheme

错误是这样的:

[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC Microsoft Access Driver] 查询表达式'COUNT(case when DrawingTypeFK = 'Civil' then 1 else null end)'中的语法错误(缺少运算符) .

任何想法为什么?我唯一的理论是它是访问驱动程序,但我使用此数据源(没有计数案例)的其他查询很好。

干杯 尼尔

【问题讨论】:

  • 因为...访问。停止使用 Access,它不是为支持 Web 应用程序而构建的,而是使用 MySQL 或 PostgreSQL 之类的东西。它们都是免费的,而且比 Access 更强大,更适合支持 Web 应用程序。
  • 说真的,我敢猜测这是 Access 的 JDBC 驱动程序的问题。
  • 我不能代表较新版本的 Access,但我上次使用它时,SQL 不支持 CASE。作为桌面程序,它是有限的。当然这是很久以前的事了,但这可能是这里的原因,而不是驱动程序问题。要验证它,请从等式中删除 CF 并直接在 Access 中运行 SQL。老实说,即使是 MS 也建议不要在多线程 Web 应用程序中使用 Access。正如 Scott 所说,它不是为它设计的。
  • 与您的问题无关,但您可能有逻辑错误。每当我写一个像你这样的查询时,我都会使用 sum(case ...)。
  • 在这种特定情况下,使用sum(case when .. then 1 else 0 end) 应该不会对最终结果产生任何影响。也就是说,我也倾向于使用sum

标签: sql-server coldfusion count ms-access-2007 case


【解决方案1】:

Access 的数据库引擎不支持CASE ... WHEN,因此您需要重写查询。您可以在 Access SQL 中使用IIf() 来近似CASE ... WHEN

SELECT  SiteFK,
  Scheme,
  Count(IIf(DrawingTypeFK = 'Civil', 1, null)) as CCount

Count() 只计算非 Null 值,所以这应该给你我认为你想要的。但是,如果您想按照 cmets 中的建议使用 Sum(),这也应该可以:

Sum(IIf(DrawingTypeFK = 'Civil', 1, 0)) as CCount

【讨论】:

  • 太棒了 - 非常感谢您的解决方案!它阻止了我在我的 IS 部门看起来像个白痴,他们可能会尝试重新安装所有驱动程序,但无济于事。
  • 好吧,就像我在 cmets 中提到的那样,对于这样的问题,“从等式中删除 CF 并直接在 Access 中运行 SQL”是个好主意。如果它在 Access 中不起作用.. 你知道这不是驱动程序问题 :)
【解决方案2】:

我没有测试过这段代码,我想它会比你的代码效率低得多,但它应该可以在 MS Access 中工作。如果您的代码在您需要的任何地方都可以工作,我会说它比下面的代码更可取。

SELECT
        SiteFK,
        Scheme,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Civil'
        ) AS CCount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Mechanical'
        ) AS MCount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Electrical'
        ) AS ECount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'P & ID'
        ) AS PCount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Zoning'
        ) AS ZCount
  FROM      Drawings.tblDrawingsData
  WHERE     SiteFK = 'MYSITE'
  GROUP BY  SiteFK, Scheme
  ORDER BY  Scheme

这是一个相关的子查询,所以它可能会很慢。买家小心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2011-07-02
    相关资源
    最近更新 更多