http://www.cnblogs.com/shuai/archive/2010/05/25/1743278.html
http://www.aspxhome.com/database/mssql/20104/1373723.htm
参考下
感觉按第二种解决方案,如果数据量稍大点,数据库会被拖死。
个人建议从实际需求出发,在录入数据时做分类和拆分比较好。
比如:将文字、数字、数字+文字 分为3类,然后对类别进行排序。
途牛旅游网招java、前端、架构、研发经理感兴趣欢迎联系我或者邮件 wuhuanhong@tuniu.com。
设计师的问题要工程师来解决,这个世道......
问题要从源头抓起,提高油品质量,把煤洗干净,要不然你需要花多十倍百倍治理雾霾。
你在这个表里面在加入一个字段专门用来排序吧,然后你就可以先按照这个字段排序,在按照你的sub1排序,这样效率高,而且就算以后有人要求你改变排序,也会很方便的
个人表示比较蛋疼,给出一个示例,你可以改进为按字母打头的正确方法。
IF NOT OBJECT_ID('[ChineseSort]') IS NULL DROP TABLE ChineseSort GO CREATE TABLE ChineseSort( [TID] INT IDENTITY(1,1) PRIMARY KEY, [TITLE] NVARCHAR(100)) GO --truncate table ChineseSort; INSERT ChineseSort SELECT '500K天上人间' UNION ALL SELECT '鸟巢' UNION ALL SELECT '五棵松' UNION ALL SELECT '200K龙宫' GO SELECT * FROM ChineseSort ORDER BY TITLE DESC; /* 3 五棵松 2 鸟巢 1 500K天上人间 4 200K龙宫 */ /**** 创建一个函数 *************/ IF OBJECT_ID (N'dbo.RegexMatch') IS NOT NULL DROP FUNCTION dbo.RegexMatch GO CREATE FUNCTION dbo.RegexMatch ( @pattern VARCHAR(2000), @matchstring VARCHAR(8000)--Varchar(8000) got SQL Server 2000 ) RETURNS INT /* The RegexMatch returns True or False, indicating if the regular expression matches (part of) the string. (It returns null if there is an error). When using this for validating user input, you'll normally want to check if the entire string matches the regular expression. To do so, put a caret at the start of the regex, and a dollar at the end, to anchor the regex at the start and end of the subject string. */ AS BEGIN DECLARE @objRegexExp INT, @objErrorObject INT, @strErrorMessage VARCHAR(255), @hr INT, @match BIT SELECT @strErrorMessage = 'creating a regex object' EXEC @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp OUT IF @hr = 0 EXEC @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern --Specifying a case-insensitive match IF @hr = 0 EXEC @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 1 --Doing a Test' IF @hr = 0 EXEC @hr= sp_OAMethod @objRegexExp, 'Test', @match OUT, @matchstring IF @hr <> 0 BEGIN RETURN NULL END EXEC sp_OADestroy @objRegexExp RETURN @match END GO /**********查询 ********/ SELECT title FROM dbo.ChineseSort ORDER BY dbo.RegexMatch('[u4e00-u9fa5]', title) DESC,title DESC; /**************************** 500K天上人间 200K龙宫 五棵松 鸟巢 **********************/
CREATE TABLE ChineseSort( [TID] INT IDENTITY(1,1) PRIMARY KEY, [TITLE] NVARCHAR(100)) GO
--truncate table ChineseSort;
INSERT ChineseSort SELECT '500K天上人间' UNION ALL SELECT '鸟巢' UNION ALL SELECT '五棵松' UNION ALL SELECT '200K龙宫'
;
with tmp as ( select *,case when ascii(TITLE) < 128 then 1 else 0 end orderby from ChineseSort ) select * from tmp order by orderby desc,TITLE desc
可以把表分为两张表,一张有数字在前,一张没数字在前,然后在排序,再把两张表合并起来就行了。