【问题标题】:Error when using (case and len) in where statement在 where 语句中使用(case 和 len)时出错
【发布时间】: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


【解决方案1】:

您需要一个不同的WHERE 子句。造成这种误解的原因可能是,在 T-SQL 中 CASE 是一个表达式,而不是“流控制”语言元素。

WHERE 
   (
      (LEN(@acc_id) > 8) AND (crm.client_acc in (SELECT client_id FROM client_crm))
   ) OR
   (
      (LEN(@acc_id) <= 8) AND (crm.client_acc in (SELECT client_acc FROM client_crm))
   )

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2018-12-25
    • 2018-07-23
    • 2013-10-16
    • 2017-01-27
    相关资源
    最近更新 更多