我对MS-SQL Server有疑问。
Select Name, max(Class),min(Rank)
from table t with (nolock)
group by Name
上述查询是否会返回包含max(Ascii(Class))
的值Select Name,max(Ascii(Class)),min(Rank)
from table t with (nolock)
group by Name
或以下列方式
Select Name,max(cast(Class as varbinary)),min(Rank)
from table t with (nolock)
group by Name
这是SQL Server如何处理它们并返回值...任何人都可以告诉我SQL Server处理的正确方法
答案 0 :(得分:1)
取决于collation 1 。服务器具有默认排序规则,数据库具有默认排序规则,字符串列具有排序规则,您可以在特定查询期间覆盖排序规则。
所以,
declare @t table (
Col varchar(50) not null
)
insert into @t(Col) values ('s'),('t'),('ß')
select
MAX(col collate Latin1_General_CS_AS),
MAX(col collate Latin1_General_100_BIN)
from @t
返回:
-------- --------
t ß
没有COLLATE
强制转换的结果,取决于Class
列的排序规则。在创建该列时,将显式设置,或者通过继承创建时的数据库默认值来设置。
1 基本上,归类让你告诉SQL Server应该为您的特定数据使用哪种排序顺序和比较规则,因此MAX
只是应用已经选择的规则。
答案 1 :(得分:0)
SELECT MAX(Class)
将返回以desc顺序排在第一位的字符串..
意味着你有ttt,tuv,tav意味着结果将是tuv
但是SELECT MAX(Ascii(Class))
返回字符串dude ....中第一个字符的第一个ascii值。
在SELECT max(cast(Class as varbinary))也像SELECT MAX(Class)查询一样工作......
答案 2 :(得分:-1)
Select Name, max(Class),min(Rank)
from table t with (nolock)
group by Name
这将返回Alphabetically top 1 from descending order
Select Name,max(Ascii(Class)),min(Rank)
from table t with (nolock)
group by Name
这一行从所有行中取first letter's ASCII value
并返回MAX值。对于例如类是"结束",' E'的ASCII值。是' 69'。