查询查询中的CASE

时间:2018-01-16 13:06:39

标签: sql sql-server coldfusion case qoq

在ColdFusion中,在查询了MSSQL数据库并添加了几行QueryAddRow函数之后,我需要通过查询查询来重新排序查询。我需要的顺序要求我在ORDER BY子句中使用CASE表达式,如下所示:

<cfquery name="newquery" dbtype="query">
SELECT * FROM query
ORDER BY 
  CASE
    WHEN var LIKE 'All' THEN 'Zz'
    WHEN var LIKE '9%' THEN '0'
    ELSE var 
  END, year
</cfquery>

这会返回错误:Error Executing Database Query. Caught an exception, type = Database。我也试图使用QueryExecute

如果我直接查询数据库,查询工作正常,所以当我尝试查询查询时,我只会收到错误。如果我删除CASE表达式并且只执行(...) ORDER BY var, year查询查询也可以正常工作,所以在我看来CASE在查询查询中是不可能的。这是正确的,还是应该以某种方式使用CASE?

这是我需要重新排序的结构(在添加了三行之后)。显然,我删除了与手头问题无关的所有列。

year | var 
2001 | 9-12
2002 | 9-12
2003 | 9-12
2001 | 12+
2002 | 12+
2003 | 12+
2001 | All
2002 | All
2003 | All
2000 | 9-12
2000 | 12+
2000 | All

如您所见,我正在使用CASE按自定义顺序对var列进行排序。我愿意接受可能完全绕过这个问题的建议。

如果不清楚,请告诉我。

3 个答案:

答案 0 :(得分:4)

查询查询仅支持某些事情 - 案例构造看起来不是其中之一。

我的建议是使用QueryAddColumn向查询对象添加sortBy列。然后遍历此查询并为此列分配适当的值。然后按Q Q中的此列进行排序。

或者,您可以简单地执行您所说的能够执行的操作,并将逻辑合并到原始数据库查询中。

答案 1 :(得分:1)

  • 创建一个包含CASE表达式的列。
  • 在星号
  • 之前添加此列
  • 使用Order By 1

答案 2 :(得分:1)

不熟悉MSSQL(我使用的是Oracle),看起来您正在ORDER BY子句中创建虚拟排序列。为什么不在原始MSSQL查询的SELECT子句中创建虚拟排序列?这样,它在QoQ中已经可用,没有任何额外的逻辑。当然,您需要CFCASECFIF代码才能处理QueryAddRow()声明。

您的初始MSSQL查询看起来像这样。

<cfquery name="query" datasource="MSSQL_DSN">
SELECT
    year,
    ...,
    var,
    CASE
        WHEN var LIKE 'All' THEN 'Zz'
        WHEN var LIKE '9%' THEN '0'
        ELSE var 
    END, myDummySortCol
</cfquery>

你的QueryAddRow()看起来像这样。

<cfif varToAdd eq "All">
    <cfset QueryAddRow(query, {year="#yearToAdd#", ..., var="#varToAdd#", myDummySortCol="Zz"})>
<cfelseif Left(varToAdd, 1) eq "9">
    <cfset QueryAddRow(query, {year="#yearToAdd#", ..., var="#varToAdd#", myDummySortCol="0"})>
<cfelse>
    <cfset QueryAddRow(query, {year="#yearToAdd#", ..., var="#varToAdd#", myDummySortCol="#varToAdd#"})>
</cfif>

你的QoQ会是这样的。

<cfquery name="newquery" dbtype="query">
SELECT * FROM query
ORDER BY myDummySortCol
</cfquery>