大概在去年的時候,做項目中遇到這麼一個需求,如圖所示,根據Type欄位篩選查找對應數據行,並找到該行欄位為Levels中值最小的數據,例如當Type=1的時候,取出來的是0,當Type=2的時候,取出來的是2,當Type=3的時候,取出來的是1,當我第一次看到數據存儲方式的時候,我是有點吃驚的,因為 ...
大概在去年的時候,做項目中遇到這麼一個需求,如圖所示,根據Type欄位篩選查找對應數據行,並找到該行欄位為Levels中值最小的數據,例如當Type=1的時候,取出來的是0,當Type=2的時候,取出來的是2,當Type=3的時候,取出來的是1,當我第一次看到數據存儲方式的時候,我是有點吃驚的,因為一般來說,存多個id的時候,一般是這樣寫“1,2,3,4”,但這個表數據存進去的時候卻在前後都加了一個逗號,這種寫法並不常見,想了很久都沒想出如何通過語句篩選。
沒想出問題,百度也不知道如何下手,最後還是同事告訴我一個方法,即通過master..spt_values方式進行搜索,老實講也是第一次看到這個詞 ,後來百度了下,大概理解了下,這個其實可以理解為資料庫自帶的一個常量表,之所以這樣命名,因為它是在master系統資料庫下麵的視圖裡面,如圖所示,使用它主要使用它的number欄位和type欄位,master..spt_values表的欄位值為P的對應number欄位值是從0-2047,可以理解為一個輔助表吧,通過關聯該表取出指定位置數據。下麵是我的語句
SELECT TOP 1 T.c FROM
(SELECT c = SUBSTRING(a.Levels, b.number, CHARINDEX(',', a.Levels + ',' , b.number) - b.number)
FROM LevelConfig a
JOIN master..spt_values b on b.type='p' and b.number between 1 and LEN(a.Levels)
WHERE SUBSTRING(',' + a.Levels, b.number, 1) = ',' AND a.Type=3) T
WHERE T.c<>''
然後就可以得到結果了