【问题标题】:Syntax error in select case选择案例中的语法错误
【发布时间】:2012-10-03 11:16:39
【问题描述】:

几天前我开始学习 SQL,我有以下查询,它在“case”附近给我一个错误,我似乎无法弄清楚:

SELECT * , Stuff((SELECT ', ' +  CAST( orderid as varchar(10))
      FROM( oitems t2 
 case when (ocardtype in ('PayPal','Sofort') OR
        ocardtype in ('mastercard','visa') and
        odate is not null) then 
              FOR XML PATH(''), 1, 2, '') [Proccessed] else  FOR XML PATH(''), 1, 2, '') [NotProccessed] end)
                      FROM orders t1
    Group by orderid,t1.odate, t1.ocardtype

我猜你知道这段代码应该做什么,但我不确定这是否是使用 select case 的正确方法。

oitems table

+---------+-----------+----------+
| orderid | catalogid | numitems |
+---------+-----------+----------+
| o737    |       353 |        1 |
| o738    |       364 |        4 |
| o739    |       353 |        3 |
| o740    |       364 |        6 |
| o741    |       882 |        2 |
| o742    |       224 |        5 |
| o743    |       224 |        2 |
+---------+-----------+----------+






orders table
    +-----------------+------------+------------+
    |         orderid | ocardtype  |   odate    |
    +-----------------+------------+------------+
    |     o737        | Paypal     |            | 'OK
    |     o738        | MasterCard | 01.02.2012 | 'OK
    |     o739        | MasterCard | 02.02.2012 | 'OK
    |     o740        | Visa       | 03.02.2012 | 'OK
    |     o741        | Sofort     |            | 'OK
    |     o742        |            |            | 'ignore because ocardtype is empty
    |     o743        | MasterCard |            | 'ignore because Mastercard no odate
    +-----------------+------------+------------+

预期结果

+-----------+------------------------+--------------+
| catalogid | ProcessedSucssessfully | NotProcessed |
+-----------+------------------------+--------------+
|       353 |o737,o739               |              |
|       364 |o738,o740               |              |
|       882 |o741                    |              |
|       224 |                        |o742,o743     |
+-----------+------------------------+--------------+

我有以下条件,你可以在上面代码的case语句中找到

  1. 如果ocardtype 为空,则将orderid 添加到NotProcessed

  2. 如果某个订单的ocardtype 是万事达卡或维萨卡,并且日期为空,则将orderid 添加到NotProcessed

  3. 如果ocardtype 是Paypal 或Sofort,则不要检查日期并将orderid 添加到ProcessedSucssessfully

【问题讨论】:

  • 第一个线索是开括号的数量与闭括号的数量不同。理想情况下,它们应该匹配。
  • 你有 10 个左括号和 12 个右括号。换句话说,您有多个基本语法错误。先纠正那些,然后看看你是否还有问题。此外,在提出问题时,您需要指定您使用的 SQL 类型,因为它们都是不同的。
  • 指定您的 RDBMS,似乎是 MS SQL Server,哪个版本?
  • @user1570048 您的语法似乎有几处错误。你到底想在这里做什么?您能否发布一些示例数据,然后发布预期结果?
  • @bluefeet 我马上就去做

标签: sql sql-server-2008-r2 case for-xml-path


【解决方案1】:

检查此请求

SELECT CatalogId, ProcessedSucssessfully = 
       STUFF((SELECT ', ' + b.OrderId
              FROM oitmes b JOIN orders o ON b.OrderId = o.OrderId
              WHERE b.CatalogId = a.CatalogId
              AND (o.OcardtType in ('PayPal','Sofort') OR o.OcardtType in  ('mastercard','visa') and o.odate is not null)    
              FOR XML PATH('')), 1, 2, ''),
                  NotProcessed =
        STUFF((SELECT ', ' + c.OrderId
               FROM oitmes c JOIN orders o ON c.OrderId = o.OrderId
               WHERE c.CatalogId = a.CatalogId
               AND (o.OcardtType in ('mastercard') OR o.OcardtType is null) and o.odate is null
               FOR XML PATH('')), 1, 2, '')
FROM oitmes a
GROUP BY a.CatalogId

SQLFiddle上的演示

【讨论】:

    【解决方案2】:

    您似乎在CASE 之前而不是之后使用FROM 子句:

    SELECT   ProductNumber, Category =
          CASE ProductLine
             WHEN 'R' THEN 'Road'
             WHEN 'M' THEN 'Mountain'
             WHEN 'T' THEN 'Touring'
             WHEN 'S' THEN 'Other sale items'
             ELSE 'Not for sale'
          END,
       Name
    FROM Production.Product
    ORDER BY ProductNumber
    

    我能想到的另一件事是,您没有使用 CASE 返回 true 或 false,这可能会给您带来错误。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2023-04-11
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多