SQL Server:用数字排序字母
问题描述:
我不擅长SQL - 下面是我迄今为止搜索过的内容。 正如你在图片中看到的,BarangayName
没有按顺序排列。正如你所看到的,Letter和Brgy 10 and Brgy 11
之间有一个'Z , S, and 1'
彼此很远。SQL Server:用数字排序字母
select *
from dbo.barangay as a
order by SUBSTRING(a.barangayname, PATINDEX('%[0-9]%', a.barangayname), LEN(a.barangayname))
答
您的查询正在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)))))
答
我试图找出什么为你。
让我们以下面的示例数据:
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
将结果为:
但是,通过使用下面的代码,以获得为您定制排序,
;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);
可以实现:
这是否有意义?
编辑要解决转换的问题
为避免转换问题,有以下替换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
答
试试这个。它可以帮助你。
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
我必须缺少一些东西。如果你想用'barangayname'排序,那么为什么不使用'order by barangayname'? –
@GordonLinoff我尝试一下,但结果是不同的。如果我使用'order by a.barangayname',结果是'barangay 1,barangay 11,barangay 12' – KiRa
您应该提供更多细节。例如:你的'barangayname'结构,你想要排序的第一个,然后第二个? – TriV