2013-10-21 39 views
0

我正在使用SQL服务器(2008),似乎无法在IIF语句的布尔部分中使用LIKE语句。附近有语法错误:在IIF声明的第一部分中是否可以使用类似声明?

下面的查询运行正确,所以我的LIKE语句的语法似乎罚款:运行下面的查询时

SELECT * 
FROM dbo.IpPbxCDR 
WHERE dbo.IpPbxCDR.OriginationNumber LIKE '+31%' 

但是:

SELECT * 
FROM dbo.IpPbxCDR 
WHERE IIF(dbo.IpPbxCDR.OriginationNumber LIKE '+31%','0' + Right([dbo.IpPbxCDR].[OriginationNumber],9), Replace([dbo.IpPbxCDR].[OriginationNumber],'+','00')) = '02' 

我得到以下错误关键字'LIKE'。

我做错了什么,或者是我在SQL Server 2008上无法做到的事情?

哦,另外一件事,如果我在Access中添加表作为链接表,并且在那里运行查询,一切正常,但我认为在这种情况下,Access做评估而不是SQL Server。

编辑:(已解决)好吧,看起来像2012版之前,需要使用Case语句。和往常一样,感谢您的输入用户,你好!

+0

难道你不把:要进行跑步相比于第一个查询(底部)ablve(顶部)时给出的比较,这是exection计划IF部分到'SELECT *,IF()... FROM'? – DanFromGermany

+0

'IIF'是[SQL Server 2012]中的新增功能(http://technet.microsoft.com/zh-cn/library/hh213574.aspx) –

+0

不,因为我需要评估IIF语句的结果。 (我正在做的是比较电话号码,但是我这样做的来源不会以“+ 31XXXXXXXX”格式给我提供电话号码,但是采用荷兰国家格式.IIF声明应该将荷兰电话号码到国家格式,并且应该用00) –

回答

1

你可以使用一个CASE Statement

SELECT * 
FROM dbo.IpPbxCDR 
WHERE CASE WHEN dbo.IpPbxCDR.OriginationNumber LIKE '+31%' 
      THEN '0' + Right(dbo.IpPbxCDR.OriginationNumber,9) 
      ELSE Replace(dbo.IpPbxCDR.OriginationNumber,'+','00')) 
     END = '02'; 

N.B我已经取代[dbo.IpPbxCDR]dbo.IpPbxCDR,因为这将寻找一个表中调用dbo.IpPbxCDR,而不是表中dbo模式称为IpPbxCDR


附录

我不知道这是否适用,但上面不会使用你可能对OriginationNumber任何指标,这是很好的,如果你使用的是在选择表达,但是在where子句中它可能会导致性能问题。要使用你可以重写如下指标:

DECLARE @Number VARCHAR(10) = '02'; 

SELECT * 
FROM dbo.IpPbxCDR 
WHERE OriginationNumber = CASE WHEN @Number LIKE '00%' THEN STUFF(@Number, 1, 2, '+') ELSE STUFF(@Number, 1, 1, '+31') END; 

这并不在不断的所有操作,因此只进行一次,而不是对每一行执行的功能。

enter image description here

测试模式

CREATE TABLE dbo.IpPbxCDR (OriginationNumber VARCHAR(15)); 
INSERT dbo.IpPbxCDR (OriginationNumber) 
VALUES ('+312'), ('+3469694535'), ('+44208979754'); 

INSERT dbo.IpPbxCDR (OriginationNumber) 
SELECT TOP 10000 '+312012' + RIGHT('0000' + CAST(ROW_NUMBER() OVER(ORDER BY a.Object_ID) AS VARCHAR(5)), 5) 
FROM sys.all_objects a 
     CROSS JOIN sys.all_objects b 
UNION ALL 
SELECT TOP 10000 '+342012' + RIGHT('0000' + CAST(ROW_NUMBER() OVER(ORDER BY a.Object_ID) AS VARCHAR(5)), 5) 
FROM sys.all_objects a 
     CROSS JOIN sys.all_objects b 
UNION ALL 
SELECT TOP 10000 '+332012' + RIGHT('0000' + CAST(ROW_NUMBER() OVER(ORDER BY a.Object_ID) AS VARCHAR(5)), 5) 
FROM sys.all_objects a 
     CROSS JOIN sys.all_objects b 

CREATE NONCLUSTERED INDEX IX_IpPbxCDR_OriginationNumber ON dbo.IpPbxCDR (OriginationNumber); 
+1

我实际上在模式CDR中的表dbo.IpPbxCDR上工作(Don'不要让我开始使用表格名称的一段时间,我也讨厌它),所以我想正确的方式是[CDR]。[dbo.IpPbxCDR]哈哈。无论如何,感谢您的输入,这确实评估正确! –

+0

我感到你的痛苦! – GarethD