如何在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>
答案 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>
这将避免返回您不需要的数据。