2

如何在 ORDER BY 中使用 cfqueryparam 以首先列出与“School of”匹配的标题,然后仅列出其余标题?这是我当前的查询:

<cfquery name="getblogs" dbType="query">
   SELECT title, id,description,date_registered,public1,uri
   FROM myquery 
where public1<>0
order by title asc
</cfquery>

我首先使用“学校”标题过滤的语法,然后其余的可以在 ASC 中排序。

编辑:如何根据 ID 匹配输出特定标题?我试过这个但得到一个错误。

<cfquery name="getschoolblogs" dbType="query">
   SELECT id, title, uri 
   FROM   myquery 
   WHERE  id = 396,378
   ORDER BY title asc
</cfquery>
4

3 回答 3

2

s 的一种方式是这样的:

<cfquery name="getblogs" dbType="query">
   SELECT title, id,description,date_registered,public1,uri,
   CASE left(title, 9) WHEN 'School of' THEN 1 ELSE 2 END as sortIdx
   FROM myquery 
   where public1<>0
   order by sortIdx, title asc
</cfquery>

你可以对条件做一些更好的变化,这只是我想到的第一个。

于 2012-10-23T19:21:33.067 回答
2

QoQ非常有限。它们不支持以这种方式更改自然排序顺序所需的运算符或函数。您可以做的是CASE在您的数据库查询中使用 a 来创建一个额外的排序列。然后在您的数据库查询或 QoQ 中对其进行排序。

     SELECT CASE WHEN title LIKE 'School of %' THEN 1
                 ELSE 2
            END AS TitleSortValue
            , title id,description,date_registered,public1,uri
     FROM   YourTable
     ORDER BY TitleSortValue, Title ASC

此外,您不能cfqueryparam在 ORDER BY 子句中使用。cfqueryparam 防止输入被评估为 sql。所以它只能用于简单的值,而不是对象(即表或列名)。

where id=396,378

编辑:要回答您以后的问题,您只能将单个值与=. 用于IN (...)过滤多个值:

   WHERE ID IN  ( <cfqueryparam value="#listOfIDValues#" 
                      cfsqltype="cf_sql_integer"
                      list="true">
                )
于 2012-10-23T19:20:02.257 回答
0

您不需要返回不需要的列,但要获得相同的结果,只需按顺序使用 case 语句。

<cfquery name="getblogs" datasource="dsn">
   SELECT title, id, description, date_registered, public1, uri
   FROM   tbl_blogs
   WHERE  public1<> 0
   ORDER BY CASE left(title, 9) WHEN 'School of' THEN 1 ELSE 2 END,
            title ASC
</cfquery>

这将避免返回您不需要的数据。

于 2012-10-24T05:47:38.413 回答