查询查询中的 CASE



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

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

查询仅支持某些内容 - case 构造似乎不支持其中之一。

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

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

  • 创建一个包含 CASE 表达式的列。
  • 在星号之前添加此列
  • 使用订购方式 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>

最新更新