この記事では、SQL サーバー に関する関連知識を提供します。主に、SQL のケース スタディにおける文字列の結合と分割に関する関連情報を紹介します。この記事では、2 つの方法をそれぞれ紹介します。この方法には、 Oracle を学習または使用するすべての人にとって、学習の参考となる価値があり、必要な友人が参照できます。
推奨学習: 「SQL チュートリアル 」
SQL の実装:
--方法一 SELECT d.dept_name,wm_concat(e.emp_name) FROM employee e INNER JOIN department d ON d.dept_id=e.dept_id GROUP BY d.dept_name;
実行結果:
SQL分析:
Oracle 独自の wm_concat() 関数を使用して文字列をマージします。ここには欠点があります。マージされた接続記号はデフォルトのカンマのみであり、他の記号は使用できません。 文字列マージ方法 2:SQL の実装:
--方法二 SELECT d.dept_name, LISTAGG (e.emp_name, ',') WITHIN GROUP (ORDER BY e.emp_name) names FROM employee e INNER JOIN department d ON d.dept_id=e.dept_id GROUP BY d.dept_name;
実行結果:
SQL 分析:
Oracle 独自の LISTAGG() 関数を使用して文字列をマージします。その利点は、マージされた接続シンボルを任意の文字として指定できることです。 ORDER BY ソートを簡単に実装できます。 文字列分割 Oracle には複数の実装方法がある可能性がありますが、私がこれまでに知っているものは 2 つあります。これら 2 つの型の実装は以下に記録されます: 文字列分割方法 1:SQL の実装:
--方法一 WITH t (id, name, sub, str) AS ( SELECT id, name, substr(class, 1, instr(class, '、')-1), substr(concat(class,'、'), instr(class, '、')+1) FROM movies UNION ALL SELECT id, name,substr(str, 1, instr(str, '、')-1), substr(str, instr(str, '、')+1) FROM t WHERE instr(str, '、')>0 ) SELECT id, name, sub FROM t ORDER BY id;
Execution結果:
#SQL 分析:このステートメントは少し複雑なので、以下で順を追って説明します。 :
まず、映画テーブルの元のデータを確認します:
1. 最初のステップは、クラス フィールドの値を次に従って除算することです。区切り文字 (ここではカンマ) 2 つの部分への予備的な分割を実行します。最初の部分は分割されるクラス フィールドの最初の値であり、2 番目の部分は分割されるクラス フィールドの残りの部分の値です。
2. 2 番目のステップでは、WITH 式を使用して再帰クエリを実装し、区切り文字 (ここではカンマ) に従って最初のステップの分割されていない値をループします (パート 2) フィールドの最後の区切り文字まで分割し、再帰の最後のデータを一時テーブル t に配置します。
3. 3 番目のステップは、2 番目のステップの一時テーブル t のレコードをクエリして並べ替える単純なクエリです。
文字列分割方法 2:
SQL の実装:--方法二
SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;
SQL 分析:
このメソッドは実際に関数をカスタマイズすることで文字列を処理します。関数分割のロジックは実際には似ています。どちらも再帰を使用して文字列内の値を区切り文字に従って 1 つずつ分割し、最終的に分割された文字列を返します。個人的には、この方法の方が優れていると感じています。分割ロジックがカプセル化されており、使いやすく、ロジックが明確になっているためです。
以下は分割関数の作成スクリプトです:
create or replace function split (p_list clob, p_sep varchar2 := ',') return tabletype pipelined is l_idx pls_integer; v_list varchar2 (32676) := to_char(p_list); begin loop l_idx := instr (v_list, p_sep); if l_idx > 0 then pipe row (substr (v_list, 1, l_idx - 1)); v_list := substr (v_list, l_idx + length (p_sep)); else pipe row (v_list); exit; end if; end loop; end;
関数の戻り値の型、tabletype もカスタム型です。
このタイプの作成スクリプトは次のとおりです:
create or replace type tabletype as table of varchar2(32676);
推奨学習: "
SQL チュートリアル以上がSQL のケーススタディ: 文字列のマージと分割の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。