2017-07-28 173 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