SQL Server-最小(テキスト)の仕組みを理解する
-
12-10-2019 - |
質問
私は少し掘り下げて、SQL Serverがどのように評価するかについての説明を探しています MIN(Varchar)
.
私はこの発言をBOLで見つけました:MINは、基礎となるデータベースで定義されている照合シーケンスの最低値を見つけます
したがって、次の値を持つ1つの行があるテーブルがある場合:
Data
AA
AB
AC
を実行します SELECT MIN(DATA)
AAに戻るでしょう。この背後にある理由を理解し、ボルをもう少しよく理解したいだけです。
ありがとう!
解決
それはによって決定されます 照合 (並べ替え注文)。ほとんどの文化では、照合順序は英語のアルファベットのアルファベット順と同じです。
- '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');
他のヒント
いいえ、MINは複数の行をスキャンする厳選されたステートメントで使用されます。それは引数として列を取得し、その列にある「最低」値(照合シーケンスに応じて)を返します。
句ごとにグループなしで使用されると、結果セットには単一の行があり、MINの値はその列で最も低い値になります。グループごとに使用されると、結果セットには各グループに1つの行があり、MINの値はグループ内の任意の行のその列で最も低い値になります。
min(x)、ここで、char(string)タイプ - char()、varchar()、nchar()、nvarchar()は、SQLの文字列比較ルールに基づいて、グループで最も低い値を見つけます。
- 2つの文字列が長さが異なる場合、短い文字(スペース)が長さの長さまでパディングされます。
- 比較は、使用中の照合シーケンスのルールに従って、左から右から文字、キャラクターごとに進みます。
- 比較では、値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
基本的に、セットを昇順のシーケンスで注文し、最初の値を選択しています。 max()、またはコースでは、逆を与え、セットを降順シーケンスで注文し、最初の値を選択します。