查询查询中的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 中可用了,无需任何额外的逻辑。当然,您随后需要 CFCASE
或 CFIF
代码来处理您的 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>
在 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 中可用了,无需任何额外的逻辑。当然,您随后需要 CFCASE
或 CFIF
代码来处理您的 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>