我正在做一些挖掘,并寻找有关SQL Server如何评估的解释 MIN(Varchar).

我在bol:min中发现了这一点

因此,如果我有一个具有以下值一行的表:

Data

AA
AB
AC

做一个 SELECT MIN(DATA) 会返回AA。我只想理解为什么背后的原因,并更好地理解BOL。

谢谢!

有帮助吗?

解决方案

它由 整理 (排序)。对于大多数文化,整理顺序与英语字母中的字母顺序相同:

  • 'aa'<'ab'
  • 'aa'<'ac'
  • 'ab'<'ac'

因此,“ AA”是最小值。对于其他文化,这可能不存在。例如,丹麦整理会将“ AB”作为最低限制,因为“ AA”>“ 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(x),其中是一个char(string)类型-CHAR(),VARCHAR(),NCHAR(),NVARCHAR(),根据SQL的字符串比较规则找到了组中最低的值:

  • 如果两个字符串的长度有所不同,则将较短的SP字符(空间)填充到较长的长度。
  • 根据使用中的整理顺序规则,比较从左到右进行。
  • 在比较中,值null比较低于任何非null值(ISO/ANSI SQL标准表明,对于NULL的汇编是低于任何非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

您基本上是按升序序列订购集合并选择第一个值。 Max()或课程为您提供逆,以降序序列订购集合并选择第一个值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top