2017-07-28 348 views
0

我不擅長SQL - 下面是我迄今爲止搜索過的內容。 正如你在圖片中看到的,BarangayName沒有按順序排列。正如你所看到的,Letter和Brgy 10 and Brgy 11之間有一個'Z , S, and 1'彼此很遠。SQL Server:用數字排序字母

enter image description here

select * 
from dbo.barangay as a 
order by SUBSTRING(a.barangayname, PATINDEX('%[0-9]%', a.barangayname), LEN(a.barangayname)) 
+1

我必須缺少一些東西。如果你想用'barangayname'排序,那麼爲什麼不使用'order by barangayname'? –

+0

@GordonLinoff我嘗試一下,但結果是不同的。如果我使用'order by a.barangayname',結果是'barangay 1,barangay 11,barangay 12' – KiRa

+0

您應該提供更多細節。例如:你的'barangayname'結構,你想要排序的第一個,然後第二個? – TriV

回答

0

您的查詢正在barangayname部分的第一個數字字符之後,並就排序。所以,只要其中第一個數字字符是0將任何其中第一個數字字符是1 進行排序字符串中的數值來之前,你需要的東西,如:

convert(int, substring(substring(barangayname, patindex('%[0-9]%', barangayname), LEN(barangayname)), 0,patindex('%[^0-9]%', substring(barangayname, patindex('%[0-9]%', barangayname), LEN(barangayname))))) 
+0

只是簡短的回答..'Barangay 10,11,12,ETC'必須按順序然後下一個是'漂移099 - 100,ETC' – KiRa

+0

這必須爲id315。我出去,可以檢查後部分。或者看看你現在可以檢查嗎?我的意思是運行所有其他行? – ViKiNG

1

我試圖找出什麼爲你。

讓我們以下面的示例數據:

DECLARE @Table as TABLE(ID INT,Name VARCHAR(100)) 
INSERT INTO @Table VALUES(134,'Brgy 1') 
INSERT INTO @Table VALUES(256,'Brgy 100') 
INSERT INTO @Table VALUES(687,'Sample 1 z1') 
INSERT INTO @Table VALUES(954,'Brgy 11 zn9') 
INSERT INTO @Table VALUES(887,'Brgy 10 zn11') 
INSERT INTO @Table VALUES(785,'Brgy 098 xys') 
INSERT INTO @Table VALUES(785,'Zone 2 wer') 

下面的SELECT語句:

SELECT * FROM @Table ORDER BY 2 

將結果爲:

enter image description here

但是,通過使用下面的代碼,以獲得爲您定製排序,

;WITH CTE AS(
    SELECT *, 
    SUBSTRING(name, 0, CHARINDEX(' ', name)) sPart, 
    LTRIM(RTRIM(SUBSTRING(name, PATINDEX('%[0-9]%', name), LEN(name))))+' ' restPart 
    FROM @Table 
) 
SELECT ID, Name 
FROM CTE 
ORDER BY 
    sPart, 
    CAST(LEFT(restPart, PATINDEX('%[^0-9]%', restPart)) AS INT); 

可以實現:

enter image description here

這是否有意義?

編輯要解決轉換的問題

爲避免轉換問題,有以下替換ORDER BY部分:

ORDER BY 
    sPart, 
    CASE 
     WHEN ISNUMERIC(LEFT(restPart, PATINDEX('%[^0-9]%', restPart)))=1 THEN CAST(LEFT(restPart, PATINDEX('%[^0-9]%', restPart)) AS INT) 
     ELSE 0 
    END; 
+0

我得到了這個錯誤。 '將nvarchar值'B'轉換爲數據類型int時轉換失敗。' – KiRa

0

試試這個。它可以幫助你。

DECLARE @Table as TABLE(ID INT,Name VARCHAR(100)) 
INSERT INTO @Table VALUES(134,'Brgy 1') 
INSERT INTO @Table VALUES(256,'Brgy 100') 
INSERT INTO @Table VALUES(687,'Sample 1 z1') 
INSERT INTO @Table VALUES(954,'Brgy 11 zn9') 
INSERT INTO @Table VALUES(887,'Brgy 10 zn11') 
INSERT INTO @Table VALUES(785,'Brgy 098 xys') 
INSERT INTO @Table VALUES(785,'Zone 2 wer') 


select ID,NAME,names,position from (
select Id,name,names,posi,convert(bigint,case when charindex(' ',posi)=0 then posi else substring(posi,1,charindex(' ',posi)) end) as position from(
select ID,Name,substring(Name,1,charindex(' ',Name)) as Names,ltrim(substring(Name,charindex(' ',Name),100)) as Posi from @Table 
) as a 
) as b 
order by names,position 
+0

我很難理解你的代碼:( – KiRa

+0

好的,我會向你解釋你的意思。是否按照你期望的那樣工作..? –

+0

I現在不知道,因爲我很難申請你的代碼。 – KiRa