我试图找出什么为你。
让我们以下面的示例数据:
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;
我必须缺少一些东西。如果你想用'barangayname'排序,那么为什么不使用'order by barangayname'? –
@GordonLinoff我尝试一下,但结果是不同的。如果我使用'order by a.barangayname',结果是'barangay 1,barangay 11,barangay 12' – KiRa
您应该提供更多细节。例如:你的'barangayname'结构,你想要排序的第一个,然后第二个? – TriV