2017-10-31 3 views
0

以下のデータセットの結果が欲しいです。私はLEFT関数を使ってみましたが、文字数がすべての行で異なっているので動作しません。私はこのような741の行を持っていますが、カテゴリのみの行が必要です。サブカテゴリは必要ありません。SQL:異なる文字サイズのカテゴリのみのデータ抽出を自動化

  • Dining->朝食
  • Dining-> Casual_Restaurants
  • エンターテインメント - > Movie_Theaters
  • エンターテインメント - > Professional_Sports_Venues

DATASET:

Dining->朝食

Dining-> Breakfast-> Casual_Restaurants

Dining-> Breakfast-> QSR_Restaurants

Dining-> Breakfast-> QSR_Restaurants-> Chick_Fil_A

Dining-> Casual_Restaurants

Dining-> Casual_Restaurants_PIQonly

ダイニング - >カジュアル_食べ物 - >アップルビーンズ

エンターテインメント - >映画のトータル

エンターテインメント - > Movie_Theaters-> AMC_Theaters

エンターテインメント - > Movie_Theaters-> Carmike_Cinema

エンターテインメント - > Professional_Sports_Venues

エンターテインメント - > Professional_Sports_Venues-> MLB_Stadiums

エンターテインメント - > Professional_Sports_Venues- > MLS_Stadiums

+0

トリックは、charインデックスを使用して2番目の文字列を見つけることです。 存在しなければ、その行を返します。あなたはあなたの望む結果から欲しい...あなたはこれまでに何を試しましたか? – Harry

+0

質問を編集し、サンプルデータ、予想される結果、コードを書式付きテキストとして投稿してください。 – Sami

+0

'Dining-> Casual_Restaurants_PIQonly'はどうですか? – MatBailie

答えて

1

一つのアプローチは、あなたの結果から、2つの以上のレベルを持つすべてのレコードを除外するために、次のようになります。私たちは2つの以上のレベルを持つレコードを除外するようなパターンを使用している上記のクエリで

create table #a (cat varchar(500)) 

insert into #a (cat) 
    values ('Dining->Breakfast') 
      ,('Dining->Breakfast->Casual_Restaurants') 
      ,('Dining->Breakfast->QSR_Restaurants') 
      ,('Dining->Breakfast->QSR_Restaurants->Chick_Fil_A') 
      ,('Dining->Casual_Restaurants') 
      ,('Dining->Casual_Restaurants_PIQonly') 
      ,('Dining->Casual_Restaurants->Applebees') 
      ,('Entertainment->Movie_Theaters') 
      ,('Entertainment->Movie_Theaters->AMC_Theaters') 
      ,('Entertainment->Movie_Theaters->Carmike_Cinema') 
      ,('Entertainment->Professional_Sports_Venues') 
      ,('Entertainment->Professional_Sports_Venues->MLB_Stadiums') 
      ,('Entertainment->Professional_Sports_Venues->MLS_Stadiums') 

SELECT cat 
FROM #a 
WHERE cat NOT LIKE '%->%->%' 

(リスト内に - >が2回表示されていると識別されます)

0

以下のサンプルコードでは、CharIndexを使用して文字列の2番目の ' - >'の先頭を見つけます。常に2番目の ' - >'があることを保証するために、文字列の最後に追加します。

このロジックは、すべてのカテゴリに少なくとも2つのレベルが含まれていると見なします。そうでなければ、ロジックを微調整する必要があります(おそらくcase文を使用していくつのレベルがあるかをテストします)。

DECLARE @val varchar(200) = 'Dining->Breakfast->QSR_Restaurants->Chick_Fil_A' 
SELECT LEFT(@val+'->', CHARINDEX('->', @val+'->', CHARINDEX('->', @val+'->', 0) + 2)-1) 
関連する問題