3

この挑戦を手伝ってください。

このコードは空白の結果を返しますが、その理由がわかりません。

ここに画像の説明を入力

select Vendor_Name + ' || ' + cast(cnt as varchar(12)) as Vendor_Count
from (select top (1) Vendor_Name, count(Vendor_Name) as cnt 
      from dbo.Vendors nolock 
      group by Vendor_Name 
      having count(Vendor_Name)>1 
      order by 2 desc) x 

しかし...内部クエリはVendor_Name を空白にし、cnt 63420 を返します

ここに画像の説明を入力

select top (1) 
    Vendor_Name, count(Vendor_Name) as cnt 
from 
    dbo.Vendors nolock 
group by 
    Vendor_Name 
having 
    count(Vendor_Name) > 1 
order by 
    2 desc

これは、トップ (1) を除いた内部クエリの結果です。ご覧のとおり、空白/空/null Vendor_Name が最も頻繁に発生します。

ここに画像の説明を入力

len() 関数を使用して Vendor_name の長さを確認すると、12 が返されます。しかし、上記の内部クエリの結果を Excel シートにコピーし、Excel で len() 関数を使用すると、Excel は 0 を示します。宣言された長さVendor_nameSQL Server テーブルのforは ですnvarchar(50)

試しisnull(Vendor_Name,'')てみCOALESCE(Vendor_Name,'')ましたが、違いはありませんでした。

クエリを再配置したところ、空白以外の結果が得られました。これが機能するのは興味深いことですが、元のクエリは機能しません。

select ' || ' + cast(cnt as varchar(12)) + ' ' + Vendor_Name  
from (select top (1) Vendor_Name, count(Vendor_Name) as cnt 
      from dbo.Vendors nolock 
      group by Vendor_Name 
      having count(Vendor_Name)>1 
      order by 2 desc) x 

しかし、この結果は私が望んでいたものではありません。

私は何か見落としてますか?

ありがとうございました!

ps。ここに投稿するためにデータを複製しようとしましたが、成功しませんでした。

4

1 に答える 1

6

これは本当のパズルです!

Vendor_Name は、文字列の終わりを示すNUL( '\0') 文字で始まる可能性があると思われます。これにより、コンテンツがないように見え、連結順序の違いが説明されます。

これをテストするREPLACE(Vendor_Name, CHAR(0), ' ')には、外部クエリで試してください

于 2013-06-02T19:09:50.123 に答える