【问题标题】:SQL multiple case statementSQL 多重 case 语句
【发布时间】:2014-06-22 23:18:52
【问题描述】:

我怎样才能使它正确?我收到一条错误消息: 关键字“DESC”附近的语法不正确。

SELECT *
FROM Companies
Order By 
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
    END, 
    CASE @Direction
        WHEN 'DESC' THEN DESC
        WHEN 'ASC' THEN ASC
    END 

我不能有两个 case 语句吗?如果没有,我如何按字段和方向传递订单名称作为参数?

谢谢!

第一个问题解决后的另一个问题表面......

如果我包含一个没有字符串数据类型的字段,如果抛出错误。 例如:

SELECT *
FROM Companies
Order By
  CASE @Direction WHEN 'DESC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
        WHEN 'Score' THEN Score

    END
  END DESC,
  CASE @Direction WHEN 'ASC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
        WHEN 'Score' THEN Score
    END
  END ASC

@OrderByField 是 nvarchar(50) 的类型 假设 Score 的数据类型为 float。

即使我不尝试按分数字段排序,上面也会引发类似下面的错误。 将数据类型 nvarchar 转换为浮点数时出错。

同样,包含 createddate 会引发错误:Conversion failed when conversion of date and/or time from string.

如果有人能提供帮助,将不胜感激。

【问题讨论】:

标签: sql


【解决方案1】:

您不能从 case 语句中返回关键字。

但是你可以通过两种方式来实现你想要的排序,但是对于你不想要的顺序返回一个常量表达式:

SELECT *
FROM Companies
Order By
  CASE @Direction WHEN 'DESC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
    END
  END DESC,
  CASE @Direction WHEN 'ASC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
    END
  END ASC

不匹配的案例将返回null,因此将被忽略以进行排序。

【讨论】:

  • 非常优雅!这正是我想要的。发布我的问题后,我的方法是两个嵌套的案例陈述。你先到了!
  • 如果您能帮助解决上述问题,我们将不胜感激。谢谢波西米亚人!
  • 您需要将CreatedDate 转换为字符类型,但语法因数据库而异:您使用的是什么数据库?
  • 我正在使用 sql server 2013
【解决方案2】:

由于ASCDESC 是关键字,您不能将它们作为CASE 的返回值。

您可以制作两种情况,一种用于ASC,一种用于DESC

SELECT *
FROM Companies
Order By 
  CASE
    WHEN @OrderByField = 'CompanyName' AND @Direction = 'ASC' THEN CompanyName
    WHEN @OrderByField = 'CreatedDate' AND @Direction = 'ASC' THEN CreatedDate
  END ASC,
  CASE
    WHEN @OrderByField = 'CompanyName' AND @Direction = 'DESC' THEN CompanyName
    WHEN @OrderByField = 'CreatedDate' AND @Direction = 'DESC' THEN CreatedDate
  END DESC

请注意,一个 case 中的所有值都必须具有相同的数据类型,因此您可能需要一对 case 用于字符串,一对 case 用于日期。

【讨论】:

  • 我很抱歉没有在下面看到您的评论。感谢您预测我会遇到的问题。
  • 问题:你的 sql 语句不会产生类似这样的结果:“SELECT * FROM Companies Order By CompanyName ASC, DESC”?因为第二个 desc 在 case 语句之外,无论如何都会运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2023-02-07
  • 2022-06-22
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多