2013-10-21 255 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