2

sql-server から次の結果が得られるのはなぜですか?

SELECT '' + 12 C1, CONVERT(int, '') C2,
       CASE WHEN '' = ' ' THEN 'equal' ELSE 'not equal' END C3

Sql-Server Fiddle デモ

--Results
| C1 | C2 |    C3 |
-------------------
| 12 |  0 | equal |

編集: C3 が回答されました。誰も'' + 12 = 12が文字列の連結を考えると答えましたが、それは数学的な操作です。sql-server で 0 に変換する理由 (方法ではない)は明確ではありません。''

4

3 に答える 3

9

これは、多かれ少なかれ予想される動作です。SQL (ISO/ANSI) 標準のコピーから:

2 つの文字列式の比較は、比較に使用される照合によって異なります。長さが等しくない値を比較する場合、比較の照合にNO PAD特徴があり、短い方の値が長い方の値の接頭辞と等しい場合、短い方の値は長いほうの値よりも小さいと見なされます。比較の照合にPAD SPACE特性がある場合、比較のために、右側の <space> を連結することにより、短い方の値が長い方の値の長さに効果的に拡張されます

現在、ほとんどの DBMS は文字列比較を実装していますが、わずかな違いがあります。SQL_Server と MySQL では''、 、' ''  'および'   '(0、1、2、および 3 個のスペースを含む文字列) は、VARCHARまたはとして定義されているかどうかに関係なく、すべて等しいことがわかりますCHAR

Postges では、それらVARCHARが等しい場合はすべて等しくありません (したがって、列CHARにパディングはありません)。VARCHARそのうちの 1 つが VARCHAR と 1 つの CHAR の場合、それらは等しいと判断されるため、比較の前にパディングが行われると思います。

Oracle は Postgres に似ていますが、空の文字列''が (ほとんどすべての場所で) として動作するという特別な特徴がありますNULL。したがって、それを 1 つ以上のスペースを含む文字列 (またはそれ自体) と比較すると、結果は True でも False でもなく、UNKNOWN. Oracle にはもう 1 つの違いがあります。1 つの文字列が として定義されVARCHAR、もう1 つの文字列が として定義されているCHAR場合、比較はかなり複雑になります。テストからCHAR、その場合、(定義されたデータ型)の長さまでのみがパディングされ、 unpadded と比較されると仮定しVARCHARます。

SQL-Fiddleで(4つのDBMSすべて)を確認できます

于 2013-02-24T19:34:54.353 に答える
4

C1- ここで暗黙の変換が行われ、空の文字列が 0 に変換されます。これは、12(`0 + 12) を取得する理由を説明しています。

C2- 明示的に''整数に変換すると、 0. 少し人工的ですが、それが機能する方法です(変更される可能性があります-これが文書化されていないことを知っている限り、そうでないことを知っている人は修正してください)。

C3- muhmud による回答を参照してください- 基本的に、異なる長さの文字列を比較すると、短い方が最初に長い方の長さにスペースで埋められます。

于 2013-02-24T19:27:57.120 に答える
3

SQL Server には奇妙な機能があり、2 つの文字列が比較され、それらの長さが等しくない場合、短い方を長い方の長さに合わせてパディングしてから比較します。パディング文字はスペースです。http://support.microsoft.com/kb/316626

C1 & C2 は、空の文字列を 0 に暗黙的かつ明示的に変換するだけです。

于 2013-02-24T19:04:47.203 に答える