2010-09-10 37 views
0

我有一個T-SQL存儲過程是提供數據的量好一個.NET頁面上的網格....以至於我把選擇的頂部「0-9」的頁面和字母表中的每個字母,以便當用戶單擊該字母時,我想根據以第一個字母開頭的結果篩選結果。假設我們正在使用產品名稱。所以如果用戶點擊「A」,我只希望我的存儲過程返回SUBSTRING(ProductName,1,1)=「A」的結果。利用子和ISNUMERIC T-SQL Case語句

給我帶來了掛了是對以數字開頭的產品名稱。在這種情況下,我希望獲取所有ProductName值,其中ISNUMERIC(SUBSTRING(ProductName,1,1))= 1。我使用一個名爲@FL的輸入參數。 @FL將會是零(我們有很少的產品是以數字開頭的,所以我把它們全部湊在一起)。

當然,還有WHERE SUBSTRING(ProductName,1,1)IN('0','1','2'.....)的替代方案,但即使如此,我從未能夠設計一個CASE語句,它將對一個評估執行an =和對另一個執行一個IN語句。

下面是我在我的PROC我的WHERE子句的情況下部分。它不起作用,但如果僅從僞代碼的角度來看它可能是有價值的。

預先感謝您的任何想法。

AND CASE @FL 
    WHEN "0" THEN 
    CASE WHEN @FL = "0" THEN 
     isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1 
    ELSE 
     SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL    
    END 
END 

***我知道,這使用CASE語句是「非標」,但我在網上找到的,認爲它有一些承諾。但試圖使用單個CASE語句產生相同的結果('='附近有錯誤)。

+0

內殼多餘的 - 該ISNUMBERIC就一定會執行,因爲@FL已經測試爲「0」 – 2010-09-10 21:04:31

回答

1

爲什麼不直接使用Like運算符?

Where dbo.AssnCtrl.Name Like @FL + '%' 

當他們選擇的任何號碼選項,在@FL傳爲 '[0-9]'

(我假定你對這個名字列的索引?)

+0

像你的想法,但考慮到@FL將爲0或一封信,這對於第一個字符是1-9的值如何工作?我不明白這是如何工作的數字。 – Mike 2010-09-10 21:07:49

+0

看到編輯,就像可以接受括號... – 2010-09-10 21:09:13

+0

@Charles內值的範圍 - 因爲有這麼幾個數值結果,我在我的網頁鏈接組合0-9和0-5的@FL值表示爲*任何*以數字字符開頭的產品....有道理? – Mike 2010-09-10 21:10:08

1

偷有點距離查爾斯:

AND Substring(dbo.AssnCtrl.Name, 1, 1) Like 
    CASE WHEN @FL = '0' THEN '[0-9]' 
    ELSE @FL    
    END 
+0

Doh。查爾斯答案中的評論更新爲包含我的解決方案 – Bill 2010-09-10 21:23:28

+0

+1:測試SS2005,適合我。 – 2010-09-10 21:27:47

+0

更好的是消除對子串函數的調用。 'AND dbo.AssnCtrl.Name Like CASE @FL WHEN'0'THEN'[0-9]'ELSE @FL END +'%'' – 2010-09-10 21:46:54

0

你試過

AND (
     isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1 
    or 
     SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL ) 

這個工作對我來說:

select * from casefile where 
isnumeric(substring(pmin,1,1)) = 1 
or 
substring(pmin,1,1) = 'a'