sql-server - case 语句中按参数值排序并不总是有效,但如果硬编码则可以

标签 sql-server stored-procedures parameters case

如果我将“评级”传递给@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/

相关文章:

sql - 多个表上的多个 FULL OUTER JOIN

mysql - 按多个参数分组的累积和

sql - 如何将额外的 XML 追加/合并到 SQL Server 2005 中的现有 XML 字段中

sql-server - 自连接中引用的SQL Server CTE速度很慢

sql - 错误: Cannot fetch a row from OLE DB provider "ADsDSOObject" for linked server "ADSI"

sql-server - 防止存储过程同时执行两次

刷新后 MySql Workbench 存储过程丢失

php - 我想打印带参数的 PHP 查询

c++ - 如何继承构造函数,或者如何调用参数数量未知的构造函数?

python - scipy.optimize.leastsq 如何知道传递给它的参数的顺序?