SQL示例1:
SELECT TestField
FROM (VALUES('Ne'), ('NE')) AS TestTable(TestField)
ORDER BY TestField COLLATE Latin1_General_CS_AS
结果1:
Ne
NE
SQL示例2(NE与a之间有2个空格,而Ne与a之间只有1个空格):
SELECT TestField
FROM (VALUES('Ne a'), ('NE a')) AS TestTable(TestField)
ORDER BY TestField COLLATE Latin1_General_CS_AS
结果2:
NE a
Ne a
有人可以解释吗?
谢谢
第二个查询:
SELECT TestField
FROM (VALUES
('Ne a'),
('NE a')
-- 12345
) AS TestTable(TestField)
ORDER BY TestField COLLATE Latin1_General_CS_AS
对于区分大小写的排序规则,由字母顺序(位置4:<
a
)产生的差异比由大小写顺序(位置2:e
< E
)产生的差异更重要。因此NE a
是以前Ne a
。
另一个示例:和
a
(位置2)之间的区别比案例顺序(位置1:e
vs E
)更重要:
SELECT '{' + TestField + '}'
FROM (VALUES
('ea'),
('E ') -- or ('E')
-- 12
) AS TestTable(TestField)
ORDER BY TestField COLLATE Latin1_General_CS_AS
/*
TestField
---------
{E }
{ea}
*/
Rusanu的博客上有更多详细信息。
更新#1:您可以使用SQL_EBCDIC037_CP1_CS_AS
排序规则:
SELECT TestField
FROM (VALUES
('Ne a'),
('NE a')
-- 12345
) AS TestTable(TestField)
ORDER BY TestField COLLATE SQL_EBCDIC037_CP1_CS_AS
/*
TestField
---------
Ne a
NE a
*/
但是这种整理可能会产生一些奇怪的结果。
例:
SELECT x.ColA AS ColA_Latin1_General_CS_AS
FROM (
SELECT 'A'
UNION ALL
SELECT 'AB'
UNION ALL
SELECT 'ABC'
UNION ALL
SELECT 'zzzz'
) x(ColA)
ORDER BY x.ColA COLLATE Latin1_General_CS_AS
/*
ColA_Latin1_General_CS_AS
----------------------------
A
AB
ABC
zzzz
*/
与
SELECT x.ColA AS ColA_SQL_EBCDIC037_CP1_CS_AS
FROM (
SELECT 'A'
UNION ALL
SELECT 'AB'
UNION ALL
SELECT 'ABC'
UNION ALL
SELECT 'zzzz'
) x(ColA)
ORDER BY x.ColA COLLATE SQL_EBCDIC037_CP1_CS_AS
/*
ColA_SQL_EBCDIC037_CP1_CS_AS
----------------------------
zzzz
A
AB
ABC
*/
注意:我从未使用过SQL_EBCDIC037_CP1_CS_AS
归类,因此不推荐使用。
更新#2:文本值分为两列(或更多列)
-- Scenario #1: before/during insert/update, spaces are trimmed with LTRIM
SELECT TestField1 F1, TestFiel2 AS F2
FROM (VALUES
('JOHN', 'ZOE'),
('JOHN', 'Albano')
) AS TestTable(TestField1, TestFiel2)
ORDER BY TestField1 COLLATE Latin1_General_CS_AS, TestFiel2 COLLATE Latin1_General_CS_AS
/*
F1 F2
---- ------
JOHN Albano
JOHN ZOE
*/
-- Scenario #2: during insert/update spaces are not trimmed (with LTRIM)
SELECT LTRIM(TestField1) COLLATE Latin1_General_CS_AS AS F1, LTRIM(TestFiel2) COLLATE Latin1_General_CS_AS AS F2
FROM (VALUES
('JOHN', ' ZOE'), -- 1 extra space
('JOHN', 'Albano')
) AS TestTable(TestField1, TestFiel2)
ORDER BY F1, F2
/*
F1 F2
---- ------
JOHN Albano
JOHN ZOE
*/
注意:我将使用中所述的解决方案Scenario #1
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句