1

在 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 列进行排序。我对可能完全绕过这个问题的建议持开放态度。

如果有不清楚的地方,请告诉我。

4

3 回答 3

4

Query of Queries 仅支持某些事物 - case 构造出现在它不支持的事物之一。

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

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

于 2018-01-16T13:19:58.620 回答
1
  • 创建一个包含 CASE 表达式的列。
  • 在星号前添加此列
  • 使用按 1 排序
于 2018-01-16T13:18:07.913 回答
1

Not being familiar with MSSQL (I use Oracle), it looks like you're creating a dummy sort column in the ORDER BY clause. Why not create the dummy sort column in the SELECT clause of the original MSSQL query? That way it will be already available already in the QoQ without any additional logic. Of course you'd then need either CFCASE or CFIF code to handle your QueryAddRow() statement.

Your initial MSSQL query would look like something like this.

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

Your QueryAddRow() would look like something this.

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

Your QoQ would look like this.

<cfquery name="newquery" dbtype="query">
SELECT * FROM query
ORDER BY myDummySortCol
</cfquery>
于 2018-01-16T15:49:54.587 回答