2013-08-12 32 views
2

我有這樣搜索LEN的用於優化的替代()函數在SQL Server

SELECT firstName 
FROM student 
WHERE LEN(firstName) > 5 

查詢上有「的firstName」列中的非聚集索引。

通常建議不要在WHERE,HAVING等子句中使用帶有列的SQL函數。否則,sql服務器將無法使用索引。

那麼是否有任何替代方法來編寫此查詢,而不使用firstName列上的LEN()?

+0

如果'LEN ()'查詢很常見,你可以添加一個計算列到表並索引它。 –

回答

4

還有其他寫作方法。例如

SELECT firstName 
FROM student 
WHERE firstName LIKE '_____%' 

但這不是索引友好。

儘管您可以創建一個計算列,並使用LEN(firstName)和索引。

CREATE TABLE student 
(
firstName VARCHAR(100), 
LenFirstName AS LEN(firstName) 
) 

CREATE INDEX IX on student(LenFirstName) INCLUDE (firstName) 

SELECT firstName 
FROM student 
WHERE LEN(firstName) > 5 

enter image description here

+0

+1 - 對於好的答案:) – Devart

+1

@Martin:除了在表格中創建一個新的計算列之外,沒有別的選擇嗎? –

+0

@DeepakKumarPadhy - 如果您一直對'WHERE LEN(firstName)> 5'感興趣,那麼另一種方法是使用'WHERE'條件創建一個索引視圖,但這樣做不夠靈活。無論如何,您需要多久執行一次這種類型的查詢? –

0

我不知道這是否會幫助:

;WITH MyCTE AS 
(
    SELECT FirstName,  
      LEN(FirstName) AS NameLength 
    FROM student 
) 
SELECT FirstName 
FROM student 
WHERE NameLength > 5 
0

使用CTE可能是一個選項

;WITH CTE AS(
SELECT firstName, 
     LEN(firstname) AS NameLength 
FROM student 
) 
SELECT firstname 
FROM CTE 
WHERE NameLength > 5 

拉吉