2010-12-21 53 views
15

我在做一个小挖,寻找上的SQL Server如何评估MIN(Varchar)一个解释。SQL SERVER - 了解MIN(文本)是如何工作的

我发现这句话在BOL:MIN发现在底层数据库中定义

所以,如果我有一个具有一行具有以下值的表整理序列中的最低值:

Data 

AA 
AB 
AC 

做一个SELECT MIN(DATA)会返回AA。我只是想了解背后的原因,并理解BOL好一点。

谢谢!

+0

只是FYI,我认为编辑这个问题(虽然它使数据“看起来”是正确的)并没有表达OP的意图谁希望所有这些值在一行,而不是三。 – 2010-12-21 20:46:27

+0

@Larry Lustig:实际上,我认为OP的问题是误导性的,我怀疑他有一张有一行和三个值的表格 - 他可能想要一张带有单列和三行的表格,每行都有一个这样的值。那么他会怎样在该表上做一个“MIN(Data)”? – 2010-12-21 20:48:05

+0

目前尚不清楚,但我相信他确实相信MIN在一行内运行(因为他说“一行”)。我认为他把它和一个函数混淆起来,这个函数在返回最小时需要几个参数)。 – 2010-12-21 20:49:22

回答

16

它是由collation(排序)确定。对于大多数文化归类顺序是一样的,在英文字母,因此按字母顺序排列:

  • 'AA' < 'AB'
  • 'AA' < 'AC'
  • 'AB' <“ AC”

因此 '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'); 
5

不,MIN用于扫描多行的SELECT语句中。它将一列作为参数,并返回在该列中找到的“最低”值(再次根据整理序列)。

如果不使用GROUP BY子句,结果集将有一个单一的行,MIN的值将在该列中的最低值。与GROUP BY子句一起使用时,结果集对于每个组将有一行,MIN的值将是该组中任何行的该列中的最低值。

2

分钟(X), char(),varchar(),nchar(),nvarchar()根据SQL的字符串比较规则找到组中的最小值:

  • 如果两个字符串的长度不同,则用SP字符(空格)填充较短的字符长度。
  • 根据使用中的排序规则的规则,逐字符逐行进行比较。
  • 在比较中,NULL值进行比较比任何非空值下(在ISO/ANSI标准的SQL说,这是一个实现选择为NULL核对是否比任何非空值较低或较高)。

所以,如果你有一个表

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()或当然,给你反序,以降序对序列进行排序并选择第一个值。