2014-01-10 46 views
0

我正在開發針對MS SQL Server 2008的如何在單個查詢中兩次使用內置SQL函數的結果?

我用一個case語句看起來像這樣寫的其他開發人員的SQL查詢工作:

CASE 
    WHEN substring(A,4,3) is null THEN '????' 
    WHEN substring(A,4,3) in ('000','010','018') THEN '100L' 
    WHEN substring(A,4,3) = '123' AND substring(A,8,3) = 'abc' THEN 'FOO' 
END 

在這裏,我想到的是,它是多餘的使用substring(A,4,3)並且應該有某種方法來避免它。

我該如何重寫這個條款只能調用substring(A,4,3)一次?

+1

這不是一個有效的case語句,第三'WHEN'沒有相應的'THEN'。 – RedFilter

+0

@RedFilter,我修正了!我修改了查詢中的一些敏感信息,並意外地使其無效。 –

+0

沒有性能差異。引擎實際上並沒有執行那3次。優化器只需要執行一次。優化此聲明沒有用處。對此的任何替代方法只會使您的代碼不易讀。 –

回答

0

你可以做這樣的事情:

select case 
     when substr1 is null 
      then '????' 
     when substr1 in ('000', '010', '018') 
      then '100L' 
     when substr1 = '123' 
      and substring(A, 8, 3) = 'abc' 
      then 'xxx' 
     end 
from (
    select substring(A, 4, 3) as substr1 from MyTable 
    ) a 
+0

我正準備發佈完全相同的東西,然後想知道sql優化器處理查詢後最終結果是否相同。 –

+0

包含此CASE語句的較大查詢已存在於子查詢中,因此我希望避免編寫子查詢。正如你所想的那樣,我還想知道這種重複是否可以優化。 –

+0

如果您擔心必須重新執行此操作,但可以使用子查詢,cte或臨時表,但優化此作品不會對性能產生任何影響。 –

相關問題