3

これが私の問題です:

SQL 列に次のデータを含む列があります。

Answers
=======
1:2:5: <--- notice my delimiter

次のようなルックアップ テーブルに対して結合できる結果セットに数字を分割できる必要があります。

Answers_Expanded
=======
1 apple
2 pear
3 cherry
4 mango
5 grape

そして戻る

Answers
=======
apple pear grape

そのような方法はありますか?

ありがとう!

4

3 に答える 3

1

これはちょっとしたハック ( 、LIKEXML PATHおよび) であり、多値列の元の順序と一致させるのではなくSTUFF、回答をそれらの順序で並べたいと想定しています...ID

しかし、これにより、探している結果が得られます。

SELECT STUFF((
  SELECT ' ' + ae.Answer
  FROM
    Answers_Expanded ae
    JOIN Answers a ON ':' + a.Answers LIKE '%:' + CAST(ae.ID AS VARCHAR) + ':%' 
  ORDER BY ae.ID
  FOR XML PATH(''))
, 1, 1, '') AS Answers

SQLフィドル

これは次の理由で機能します。

  1. 結合すると、複数値を持つ列に一致するLIKEすべての行が検索されます。Answer_Expanded
  2. XML PATHグループ連結をシミュレート' 'し、区切り文字として指定できるようにします
  3. STUFF先頭の区切り文字を削除します。
于 2013-02-26T20:52:57.707 に答える
1

このブログ投稿には、区切り文字列の値を列に含むテーブルを返すユーザー定義関数の良い例があります。その後、そのテーブルを Answers_Expanded テーブルに結合して、値を取得できます。

これは、かなり短い文字列を解析している場合、および 1 回限りの処理として実行している場合には問題なく機能しますが、そのような列に回答が格納されたテーブルがある場合は、これを実行したくありません。パフォーマンスが大幅に低下するため、テーブル全体に影響を与えます。理想的には、SQL でこのような区切られた文字列を取得しないようにする必要があります。

于 2013-02-26T20:25:06.893 に答える
0

1つのセルに複数の情報ではなく、1つのセルに1つの数字しかない方法で回答を保存することをお勧めします。(第 1 正規形の違反)。

それ以外の場合は、T-SQL などのより高度な SQL 言語を使用することをお勧めします。

于 2013-02-26T20:16:21.627 に答える