我在做一个小挖,寻找上的SQL Server如何评估MIN(Varchar)
一个解释。SQL SERVER - 了解MIN(文本)是如何工作的
我发现这句话在BOL:MIN发现在底层数据库中定义
所以,如果我有一个具有一行具有以下值的表整理序列中的最低值:
Data
AA
AB
AC
做一个SELECT MIN(DATA)
会返回AA。我只是想了解背后的原因,并理解BOL好一点。
谢谢!
我在做一个小挖,寻找上的SQL Server如何评估MIN(Varchar)
一个解释。SQL SERVER - 了解MIN(文本)是如何工作的
我发现这句话在BOL:MIN发现在底层数据库中定义
所以,如果我有一个具有一行具有以下值的表整理序列中的最低值:
Data
AA
AB
AC
做一个SELECT MIN(DATA)
会返回AA。我只是想了解背后的原因,并理解BOL好一点。
谢谢!
它是由collation(排序)确定。对于大多数文化归类顺序是一样的,在英文字母,因此按字母顺序排列:
因此 'AA' 为最小值。对于其他文化,这可能不成立。例如,由于“AA”>“AB”,丹麦语整理将返回“AB”作为最小值。这是因为'AA'等同于'Å',这是丹麦字母表中的最后一个字母。
SELECT MIN(s COLLATE Danish_Norwegian_CI_AS) FROM table1; min_s AB
为了得到一个 “普通” 的排序顺序使用Latin1_General_Bin
归类:
SELECT MIN(s COLLATE Latin1_General_Bin) FROM table1; min_s AA
要重现这样的结果,你可以创建这个测试表:
CREATE TABLE table1 (s varchar(100)); INSERT INTO table1 (s) VALUES ('AA'), ('AB'), ('AC');
不,MIN用于扫描多行的SELECT语句中。它将一列作为参数,并返回在该列中找到的“最低”值(再次根据整理序列)。
如果不使用GROUP BY子句,结果集将有一个单一的行,MIN的值将在该列中的最低值。与GROUP BY子句一起使用时,结果集对于每个组将有一行,MIN的值将是该组中任何行的该列中的最低值。
分钟(X), char(),varchar(),nchar(),nvarchar()根据SQL的字符串比较规则找到组中的最小值:
所以,如果你有一个表
create table foo
(
myString varchar(16) not null ,
)
然后运行查询
select min(myString) from foo
会给你同样的结果集,如果你执行
set rowcount 1
select myString
from foo
order by myString
set rowcount 0
你基本上是按升序排列集合并选择第一个val UE。 MAX()或当然,给你反序,以降序对序列进行排序并选择第一个值。
只是FYI,我认为编辑这个问题(虽然它使数据“看起来”是正确的)并没有表达OP的意图谁希望所有这些值在一行,而不是三。 – 2010-12-21 20:46:27
@Larry Lustig:实际上,我认为OP的问题是误导性的,我怀疑他有一张有一行和三个值的表格 - 他可能想要一张带有单列和三行的表格,每行都有一个这样的值。那么他会怎样在该表上做一个“MIN(Data)”? – 2010-12-21 20:48:05
目前尚不清楚,但我相信他确实相信MIN在一行内运行(因为他说“一行”)。我认为他把它和一个函数混淆起来,这个函数在返回最小时需要几个参数)。 – 2010-12-21 20:49:22