1

次のクエリの出力に困惑しています。

select 
  'Eq Type' =
  case
    when 
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) = 
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type])) 
    then
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1)
    when
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) <> 
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type]))
    then
      replace([Eq Type], '-', '')
    else
      null
  end,
  'Failure_Class' =
  case
    when charindex('-', [Eq Type]) <> 0 and
      (substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) = 
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type])))
    then
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1)
    when charindex('-', [Eq Type]) <> 0 and
      (substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) <>
      substring([Eq Type], charindex('-', [Eq Type]) + 1, len([Eq Type])))
    then
      substring([Eq Type], 1, charindex('-', [Eq Type]) - 1) +
      '\' +
      replace([Eq Type], '-', '')
    when CHARINDEX('-', [Eq Type]) = 0
    then 
      Failure_Class
    else
      null
  end
from dbo.Location
  1. Location テーブルには 25385 レコードが含まれていますが、8157 レコードのみが返されます。レコードが除外されるのはなぜですか?

  2. 上記のクエリに dbo.ModifiedLocation を追加しようとすると、「無効な長さパラメーターが LEFT または SUBSTRING 関数に渡されました」というエラーで失敗します。メッセージはかなり説明的ですが、into 句を追加するとこのエラーが発生するのはなぜですか? into 句なしでクエリが正常に実行されるのはなぜですか?

編集 私が達成しようとしていることを説明したいと思います。元のデータセットには、私が興味を持っている 2 つの列、Eq Type と Failure_Class があります。データは次のようになります。

Eq Type, Failure_Class
ACCU-ACCU, ACCU
AUX-AUX, AUX
VA-BA, VA
VA-CH, VA
IP-LS, IP
null, null
VE, VE
JB, JB
VA, null

データは手作業で維持されているため、一貫性がありません。資産管理システムにインポートできるようにするには、次の形式のデータが必要です。

Eq Type, Failure_Class
ACCU, ACCU
AUX, AUX
VABA, VA\VABA
VACH, VA\VACH
IPLS, IP\IPLS
null, null
VE, VE
JB, JB
VA, VA

編集2 問題が見つかったようです。このクエリは、Toad 5.6 for SQL Server のフリーウェア バージョンで実行していました。SSMS に切り替えて "into dbo.ModifiedLocation" を削除すると、クエリでおなじみの "無効な長さパラメーターが LEFT または SUBSTRING 関数に渡されました" エラーが発生しました。これは私の2番目の質問に答えます。このエラーを解決すれば、目的の出力が得られると思います。ご協力ありがとうございました。

4

1 に答える 1

3

既存のテーブルに挿入するには、必要ですINSERT INTO dbo.ModifiedLocation SELECT ...

SELECT ... INTO dbo.ModifiedLocation FROM ...構文は、テーブルを作成するだけでなく、テーブルに挿入するためのものです。


返されたレコードの数について。JOIN、WHERE 句、GROUP BY、または DISTINCT がない限り、ソース テーブルに存在するのとまったく同じ数のレコードが返されます。

これはまさにあなたが実行しているクエリですか?

于 2011-12-31T00:35:01.637 に答える