如果我将“评级”传递给@sortBy参数,它会按预期返回结果。 如果我在 order by 子句中对列名“name”进行硬编码,它会按预期返回结果,但当传递到 @sortBy 参数时,它会返回: 将数据类型 nvarchar 转换为 float 时出错。
我需要它在传入“名称”时工作。
DECLARE @sortBy varchar(255) = N'name',
@sortDirection varchar(4) = N'D'
SELECT *,
ROW_NUMBER() OVER(
ORDER BY -- name DESC
CASE WHEN @sortDirection = 'A' THEN
CASE
WHEN @sortBy = 'rating' THEN overallRating
WHEN @sortBy = 'name' THEN name
END
END ASC
, CASE WHEN @sortDirection = 'D' THEN
CASE
WHEN @sortBy = 'rating' THEN overallRating
WHEN @sortBy = 'name' THEN name
END
END DESC
) AS RowNumber INTO #Results
FROM
(
SELECT id
, type
, name
, formatted_address
, icon
, reference
, lat
, lng
, place_id
, open_now
, photo_reference
, width
, height
, html_attribution
, price_level
, CASE WHEN
(SELECT AVG(rating)
FROM reviews r
WHERE r.places_id = place_id
AND r.delete_check = 0) IS NOT NULL
THEN (
(SELECT AVG(rating)
FROM reviews r
WHERE r.places_id = place_id
AND r.delete_check = 0) + cast(rating as float)) / 2
ELSE
rating
END AS overallRating
from search_places
where search_id = 12
) y
SELECT COUNT(*) AS RecordCount FROM #Results
SELECT * FROM #Results WHERE RowNumber BETWEEN 1 AND 20
DROP TABLE #Results
最佳答案
将其分为四种情况。
<强> SQL Demo
ROW_NUMBER() OVER(
ORDER BY
CASE WHEN @sortDirection = 'A' AND @sortBy = 'rating' THEN overallRating END ASC,
CASE WHEN @sortDirection = 'A' AND @sortBy = 'name' THEN name END ASC,
CASE WHEN @sortDirection = 'D' AND @sortBy = 'rating' THEN overallRating END DESC,
CASE WHEN @sortDirection = 'D' AND @sortBy = 'name' THEN name END DESC)
并考虑将 OPTION (RECOMPILE)
添加到 allow better index usage 的查询末尾如果您的索引可能会避免对一种或多种情况进行排序。
关于sql-server - case 语句中按参数值排序并不总是有效,但如果硬编码则可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37755098/