CASE 语句 - 已达到表达式服务限制

CASE Statement - An expression services limit has been reached

我收到以下错误:

An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

我正在尝试 运行 下面的查询,但是在我的 case 语句中似乎有一行太多(当我删除“伦敦”行时,它工作得很好)或“苏格兰”例如。

我想不出拆分此语句的最佳方式。 如果我将它分成 2 个查询并合并所有,它确实有效。然而 ELSE 'No Region' 成为一个问题。查询第一部分中包含的所有内容在查询的第二部分都显示为“无区域”,反之亦然。

(我的最终目标基本上是创建每个区域的客户列表)然后我可以将其用作区域销售报告的基础。

非常感谢

安迪

SELECT T0.CardCode, T0.CardName, T0.PostCode,
  
  CASE
WHEN T0.PostCodeABR IN  ('DG','KW','IV','PH','AB','DD','PA','FK','KY','G','EH','ML','KA','TD') THEN 'Scotland' 
WHEN T0.PostCodeABR IN  ('BT') THEN 'Ireland' 
WHEN T0.PostCodeABR IN  ('CA','NE','DH','SR','TS','DL','LA','BD','HG','YO','HX','LS','FY','PR','BB','L','WN','BL','OL') THEN 'North M62' 
WHEN T0.PostCodeABR IN  ('CH','WA','CW','SK','M','HD','WF','DN','HU','DE','NG','LN','S') THEN 'South M62' 
WHEN T0.PostCodeABR IN  ('LL','SY','LD','SA','CF','NP') THEN 'Wales' 
WHEN T0.PostCodeABR IN  ('NR','IP','CB') THEN 'East Anglia' 
WHEN T0.PostCodeABR IN  ('SN','BS','BA','SP','BH','DT','TA','EX','TQ','PL','TR') THEN 'South West' 
WHEN T0.PostCodeABR IN  ('LU','AL','HP','SG','SL','RG','SO','GU','PO','BN','RH','TN','ME','CT','SS','CM','CO') THEN 'South East' 
WHEN T0.PostCodeABR IN  ('ST','TF','WV','WS','DY','B','WR','HR','GL','OX','CV','NN','MK','PE','LE') THEN 'Midlands' 
WHEN T0.PostCodeABR IN  ('WD','EN','HA','N','NW','UB','W','WC','EC','E','IG','RM','DA','BR','CR','SM','KT','TW','SW') THEN 'London' 

ELSE 'No Region'

END AS 'Region'
   FROM [dbo].[REPS-PostcodeABBR] T0

正如我在评论中提到的,我建议您为 post 代码创建一个“查找”table,然后您需要做的就是 JOIN table,并且没有“凌乱”和大的CASE 表达式(T-SQL不支持CaseSwitch) 语句).

所以您的查找 table 看起来有点像这样:

CREATE TABLE dbo.PostcodeRegion (Postcode varchar(2),
                                 Region varchar(20));
GO
--Sample data
INSERT INTO dbo.PostcodeRegion (Postcode,Region)
VALUES('DG','Scotland'),
      ('BT','Ireland'),
      ('LL','Wales');

然后您的查询将执行 LEFT JOIN:

SELECT RPA.CardCode,
       RPA.CardName,
       RPA.PostCode,
       COALESCE(PR.Region,'No Region') AS Region
FROM [dbo].[REPS-PostcodeABBR] RPA --T0 is a poor choice of an alias, there is no T not 0 in "REPS-PostcodeABBR"
     LEFT JOIN dbo.PostcodeRegion PR ON RPA.PostCodeABR = PR.Region;

请注意,您可能还想 INDEX table,and/or 将 UNIQUE CONSTRAINTPRIMARY KEY 应用于 PostCode列。

感谢您的帮助...我尝试了上述多种方法,它们都有效,但最有效的似乎是这种方法。

在 SAP 中创建了一个查找 table;此 table 包括 PostCodeFrom、PostCodeTo、PostCodeABR、地区

这看起来像; TS00、TS99、TS、北 M62

然后我完成了;

SELECT OCRD.ZipCode PCLOOKUP.Region, PCLOOKUP.PostCodeABR FROM OCRD T0 LEFT OUTER JOIN PCLOOKUP ON OCRD.ZipCode >= PCLOOKUP.PostCodeFROM AND OCRD.ZipCode <= PCLOOKUP.PostCodeFrom

基本上,如果邮政编码介于 FROM AND To 显示缩写和地区。