sqlserver中有没有办法对汉字的字段排序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver中有没有办法对汉字的字段排序?相关的知识,希望对你有一定的参考价值。

--汉字首字母查询处理用户定义函数
CREATE FUNCTION f_GetPY(@str nvarchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @py TABLE(
ch char(1),
hz1 nchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS,
hz2 nchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS)
INSERT @py SELECT \'A\',N\'吖\',N\'鏊\'
UNION ALL SELECT \'B\',N\'八\',N\'簿\'
UNION ALL SELECT \'C\',N\'嚓\',N\'错\'
UNION ALL SELECT \'D\',N\'哒\',N\'跺\'
UNION ALL SELECT \'E\',N\'屙\',N\'贰\'
UNION ALL SELECT \'F\',N\'发\',N\'馥\'
UNION ALL SELECT \'G\',N\'旮\',N\'过\'
UNION ALL SELECT \'H\',N\'铪\',N\'蠖\'
UNION ALL SELECT \'J\',N\'丌\',N\'竣\'
UNION ALL SELECT \'K\',N\'咔\',N\'廓\'
UNION ALL SELECT \'L\',N\'垃\',N\'雒\'
UNION ALL SELECT \'M\',N\'妈\',N\'穆\'
UNION ALL SELECT \'N\',N\'拿\',N\'糯\'
UNION ALL SELECT \'O\',N\'噢\',N\'沤\'
UNION ALL SELECT \'P\',N\'趴\',N\'曝\'
UNION ALL SELECT \'Q\',N\'七\',N\'群\'
UNION ALL SELECT \'R\',N\'蚺\',N\'箬\'
UNION ALL SELECT \'S\',N\'仨\',N\'锁\'
UNION ALL SELECT \'T\',N\'他\',N\'箨\'
UNION ALL SELECT \'W\',N\'哇\',N\'鋈\'
UNION ALL SELECT \'X\',N\'夕\',N\'蕈\'
UNION ALL SELECT \'Y\',N\'丫\',N\'蕴\'
UNION ALL SELECT \'Z\',N\'匝\',N\'做\'
DECLARE @i int
SET @i=PATINDEX(\'%[吖-做]%\' COLLATE Chinese_PRC_CS_AS_KS_WS,@str)
WHILE @i>0
SELECT @str=REPLACE(@str,SUBSTRING(@str,@i,1),ch)
,@i=PATINDEX(\'%[吖-做]%\' COLLATE Chinese_PRC_CS_AS_KS_WS,@str)
FROM @py
WHERE SUBSTRING(@str,@i,1) BETWEEN hz1 AND hz2
RETURN(@str)
END
GO
参考技术A 就order by 字段名 就行了吧 参考技术B 字段 汉字

SQLserver排序问题,字段中含有字母、数字、汉字,如何只按数字排序

RT
补充:汉字、数字、英文是无序组合的,大部分数据的格式如:abc-ef123-汉字或者abc-ef123
也有可能是abc-de-fsd123-45,数字、字母汉字的长度皆不定
如果有汉字,汉字肯定是在最后面

如果数据中只有数字和字母的,就直接用数字排序
如果数据中出现了数字之间是隔开的,那就不可能出现汉字,这种情况要求取前面的数字排序

如果有汉字的,数字部分就肯定是连在一起的,这种情况要求直接用数字排序,求助啊。。。

如果数字都是小于10的,可以直接order by,按照字符规则排序就是你想要的这个。
如果数字有两位以上的,这时候11会排在2的前面,如果想数字按照数字的规则排序,字母按照字母的规则排序,需要根据条件将数字和字母分别查询出来进行排序,然后使用union all联接出结果。
参考技术A 可以先把数值型转字符 再根据字符的长度和数值联合排序
order by len(CONVERT(nvarchar(3),id)) , id
参考技术B 数据库排序应该是根据第一个字符的ascii码来的,如果第一个相同,就根据第二个 参考技术C

IF OBJECT_ID('fn_GetNumberFromString') IS NOT NULL

BEGIN

DROP FUNCTION fn_GetNumberFromString;

END;

GO

CREATE FUNCTION fn_GetNumberFromString ( @str NVARCHAR(80) )

RETURNS INT

AS

BEGIN

DECLARE @i INT ,

@len INT;

SET @len = LEN(@str);

IF @len = 0

RETURN 0;

SET @i = 1;

DECLARE @char VARCHAR(1);

SET @char = LEFT(@str, 1);

DECLARE @outStr VARCHAR(80);--用于输出

DECLARE @tmpStr VARCHAR(81);--用于提高性能

SET @outStr = '';

SET @tmpStr = '0';

WHILE @i <= @len

BEGIN

IF PATINDEX('%[0-9]%', @char) = 1

AND PATINDEX('%[0-9]%', RIGHT(@tmpStr, 1)) = 1

BEGIN

SET @outStr += @char;

SET @tmpStr += @char;

END; 

IF LEN(@outStr) > 0

AND PATINDEX('%[0-9]%', @char) = 0

SET @tmpStr += @char;   

IF PATINDEX('%[0-9]%', RIGHT(@tmpStr, 1)) = 0

BEGIN

GOTO outLocation;

END; 

SET @i += 1;

SET @char = SUBSTRING(@str, @i, 1);

END; 

outLocation:

RETURN CASE WHEN @outStr='' THEN 0 ELSE CAST(@outStr AS INT ) END;

END; 

GO


参考技术D 通过正则式提取数字,再按照数字排序,就可以。

百度一下sqlserver中如何从字符串中提取数字就成了,度娘上有很多。

以上是关于sqlserver中有没有办法对汉字的字段排序?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将排除项添加到 Eclipse 的“对所有成员进行排序”?

SQL server中如何更改排序规则

使用 Apollo Federated GraphQL,有没有办法对来自外部实体的值进行排序/分页?

sqlserver数据库varchar(40)能存放多少汉字?

在sqlserver总如何对有两个字段同时排序的字段建立索引?

使用 NSFetchedresultController 对“瞬态”字段进行排序