如何在ORDER BY中使用cfqueryparam列出首先匹配“School of”的标题

时间:2012-10-23 19:05:15

标签: coldfusion sql-order-by cfquery

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

我使用什么语法首先过滤“School of”标题,然后在ASC中订购其余语法。

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

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

3 个答案:

答案 0 :(得分:2)

QoQ's非常有限。它们不支持以这种方式改变自然排序顺序所需的运算符或函数。您可以做的是在数据库查询中使用CASE来创建其他排序列。然后在数据库查询或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

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

  

where id=396,378

修改:要回答以后的问题,您只能将单个值与=进行比较。使用IN (...)过滤多个值:

   WHERE ID IN  ( <cfqueryparam value="#listOfIDValues#" 
                      cfsqltype="cf_sql_integer"
                      list="true">
                )

答案 1 :(得分:2)

其中一种方式是这样的:

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

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

答案 2 :(得分: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>

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