【发布时间】:2021-01-06 11:40:52
【问题描述】:
我正在尝试编写一个存储过程来根据@acc_id 的值从一列中提取数据。
如您所见,where CASE (len(acc_id) > 8 then client_id ELSE client_acc end) 出现错误
但我不确定我做错了什么。如果能提供任何帮助,我将不胜感激。
create procedure test_client @acc_id nvarchar(20)
as
Select
client_id,
cash_t.client_acc,
sub_trans_type,
settle_date,
dbt_crt,
cash_t.currency,
cash_amount,
cash_t.last_update
From test_cash_trans as cash_t
inner join client_crm as crm
on cash_t.client_acc = crm.client_acc
where crm.client_acc in (
select client_acc
from client_crm
where CASE (len(acc_id) > 8 then client_id ELSE client_acc end)
)
order by crm.client_acc ASC
GO
结果:
11:31:47 开始在 Line 104 Msg 102, Level 15, State 执行查询 1,过程 test_client,第 20 行 '>' 附近的语法不正确。全部的 执行时间:00:00:00.010
【问题讨论】:
-
不要在
where子句中使用case。无论如何它应该怎么做? -
WHERE没有意义。CASE有太多括号,但即使你修复了它,它也不是布尔表达式。CASE表达式应该等于什么?你所拥有的就像说WHERE (len(acc_id) > 8 AND client_id) OR (len(acc_id) <= 8 AND client_acc)。AND client_id什么? -
您的
CASE表达式在语法上不正确。应该是CASE WHEN len(acc_id) > 8 then .. END。这就是您收到错误消息的原因。 -
您是否要使用与
client_crm表不同的ID,基于@acc_id的lebgtf。如果是这样,您需要一个不同的WHERE子句。而且,你在哪里使用@acc_id? -
抱歉,我是 sql 新手,所以如果我的理解不正确,请原谅我。基本上@acc_id 可以是client_id 或client_acc。如果 acc_id 的长度大于 8,则 acc_id 为 client_id 否则为 client_acc。然后,我使用 client_id 或 client_acc 来计算要返回的查询的帐户列表
标签: sql-server azure-sql-database