Sql 选择大小写中的语法错误
我几天前开始学习SQL,我有以下查询,它在“case”附近给了我一个错误,我似乎无法理解:Sql 选择大小写中的语法错误,sql,sql-server-2008-r2,case,for-xml-path,Sql,Sql Server 2008 R2,Case,For Xml Path,我几天前开始学习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 nu
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 |
+-----------+------------------------+--------------+
我有以下条件,你可以在上述代码的情况下找到
ocardtype
为空,则将orderid
添加到NotProcessed
ocardtype
为MasterCard或Visa,且odate为空,则将orderid添加到NotProcessed
ocardtype
是Paypal或Sofort,则不要检查odate并将orderid
成功添加到Processed
似乎您是在
案例之前使用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,这可能会导致您出错。检查此请求
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
演示第一个线索是,开放括号的数量与封闭括号的数量不同。理想情况下,它们应该匹配。你有10个左括号和12个右括号。换句话说,您有多个基本语法错误。首先纠正这些问题,然后看看你是否还有问题。此外,在提问时,您需要指定使用的是哪种类型的SQL,因为它们都不同。请指定您的RDBMS,MS SQL Server,wich version?@user1570048您的语法似乎有一些问题。你到底想在这里干什么?你能发布一些样本数据和预期结果吗?@bluefeet当然,我会马上发布