查询查询中的CASE

CASE in Query of a Query

在 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>

这returns一个错误: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 列进行排序。我愿意接受可能完全规避该问题的建议。

如有不明之处请告诉我。

  • 创建一个包含您的 CASE 表达式的列。
  • 在星号前添加此列
  • 使用按 1 排序

Query of Queries 仅支持某些事物 - case 结构出现在其中一个它不支持的事物中。

我的建议是使用 QueryAddColumn 将 sortBy 列添加到您的查询对象。然后遍历此查询并为该列分配适当的值。然后在您的 Q of Q 中按此列排序。

或者,您可以简单地按照您所说的去做,并将逻辑合并到原始数据库查询中。

不熟悉 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>