【问题标题】:T-SQL - Error on Case StatementT-SQL - 案例语句错误
【发布时间】:2011-11-08 14:00:49
【问题描述】:
USE NORTHWIND;
GO
SELECT SHIPCOUNTRY,[ORDERS_ID] = 
CASE ORDERID
WHEN ORDERID = 10300
THEN 'I AM FROM 10300'
WHEN ORDERID = 10400
THEN 'I AM FROM 10400'
WHEN ORDERID = 10500
THEN 'I AM FROM 10500'
ELSE 'I AM OUT OF RANGE'
END
FROM ORDERS;
GO

错误 - 消息 102,级别 15,状态 1,第 3 行 '=' 附近的语法不正确。

如果你的sql server中有Northwind数据库,你可以执行这个查询。

我不明白问题出在哪里。谁能帮我解决这个问题?

【问题讨论】:

    标签: sql-server tsql sql-server-2005-express


    【解决方案1】:

    试试这个:

    USE NORTHWIND; 
    GO 
    SELECT SHIPCOUNTRY,  
    CASE ORDERID 
    WHEN 10300 
    THEN 'I AM FROM 10300' 
    WHEN 10400 
    THEN 'I AM FROM 10400' 
    WHEN 10500 
    THEN 'I AM FROM 10500' 
    ELSE 'I AM OUT OF RANGE' 
    END as OrdersId
    FROM ORDERS; 
    GO 
    

    当您在初始 CASE xxxx 语句中显式时,您不能在 WHEN 子句中重复该变量。这同样适用:

    USE NORTHWIND; 
    GO 
    SELECT SHIPCOUNTRY, 
    CASE
    WHEN ORDERID = 10300 
    THEN 'I AM FROM 10300' 
    WHEN ORDERID = 10400 
    THEN 'I AM FROM 10400' 
    WHEN ORDERID = 10500 
    THEN 'I AM FROM 10500' 
    ELSE 'I AM OUT OF RANGE' 
    END as OrdersId
    FROM ORDERS; 
    GO 
    

    您也不能这样分配别名。在 CASE 块之后使用 AS 关键字。

    编辑:根据 Adam Wenger 的评论,您确实可以在查询中编写像 [alias] = fieldname 这样的别名。谢谢指正!

    【讨论】:

    • Shark,我很确定你可以使用 [Alias] = CASE statement 的别名,尽管我更喜欢 END 之后的别名。
    • @AdamWenger 我不知道。我得测试一下!感谢您的更正,正是这些鲜为人知的小信息让我们变得更好!再次感谢。
    • @AdamWenger 果然,你是对的。我用更正修改了我的答案。谢谢!
    • 没问题。当我开始回答更多 SO 问题并在其他人的问题/答案中看到它时,我重新学习了它。没想到是mssql的一部分,只好自己试试!
    • @AdamWenger 哈!这难道不是事实。我想“眼见为实”。 ;)
    【解决方案2】:
    USE NORTHWIND;
    GO
    SELECT SHIPCOUNTRY,
    CASE ORDERID
    WHEN  10300
    THEN 'I AM FROM 10300'
    WHEN  10400
    THEN 'I AM FROM 10400'
    WHEN  10500
    THEN 'I AM FROM 10500'
    ELSE 'I AM OUT OF RANGE'
    END as [ORDERS_ID]
    FROM ORDERS;
    GO
    

    【讨论】:

      【解决方案3】:

      case 构造可以有两种不同的形式:

      case n
        when n then n
        when n then n
      end
      

      和:

      case
        when n = n then n
        when n = n then n
      end
      

      你正在混合它们。使用:

      SELECT SHIPCOUNTRY,[ORDERS_ID] = 
        CASE ORDERID
          WHEN 10300 THEN 'I AM FROM 10300'
          WHEN 10400 THEN 'I AM FROM 10400'
          WHEN 10500 THEN 'I AM FROM 10500'
          ELSE 'I AM OUT OF RANGE'
        END
      FROM ORDERS
      

      【讨论】:

        【解决方案4】:

        CASE 有两种格式:Simple 和 Searched。你正在混合它们。

        http://msdn.microsoft.com/en-us/library/ms181765.aspx

        【讨论】:

          【解决方案5】:
          USE NORTHWIND;
          GO
          SELECT SHIPCOUNTRY,
          CASE ORDERID 
            WHEN 10300
              THEN 'I AM FROM 10300'
            WHEN 10400
              THEN 'I AM FROM 10400'
            WHEN 10500
              THEN 'I AM FROM 10500'
            ELSE 'I AM OUT OF RANGE'
          END ORDERS_ID
          FROM ORDERS;
          GO
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-19
            • 1970-01-01
            • 2020-10-31
            相关资源
            最近更新 更多