ホームページ >データベース >mysql チュートリアル >SQL でカンマ区切りの VARCHAR 列を効率的に分割してフィルタリングする方法

SQL でカンマ区切りの VARCHAR 列を効率的に分割してフィルタリングする方法

DDD
DDDオリジナル
2024-12-24 17:48:12183ブラウズ

How to Efficiently Split and Filter a Comma-Separated VARCHAR Column in SQL?

SQL で VARCHAR 列を複数の値に分割する

SQL の VARCHAR データ型を使用すると、可変長の文字データを格納できます。多くの場合、データ フィルタリングやその他の操作を容易にするために、VARCHAR 列を複数の値に分割する必要があります。

次の例を考えてみましょう:

SELECT 
  AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448

このクエリは、「Value」という名前の列を取得します。テーブル「AD_Ref_List」から、列「AD_Reference_ID」が 1000448 に等しい場合、結果は次のリストになります。値:

CO,VO

ただし、要件は、別のテーブル "xx_insert":

SELECT xx_insert.XX_DocAction_Next
  FROM xx_insert
  WHERE xx_insert_id = 1000283

に格納されている値に基づいて結果を制限することです。このクエリの結果は次のとおりです:

CO

課題は、元のクエリを変更して、「xx_insert」の値を組み込むと同時に、カンマ区切り形式。最初の試行では、値を区切り文字列に変換しました:

AD_Ref_List.Value IN ('CO,VO')

これは望ましい結果ではありません。

解決策:

これに対処するにはこの問題を解決するには、IN 句の値を適切な区切り文字で囲み、同様に次のように囲まれたカンマ区切りのリストと照合する必要があります。区切り文字:

SELECT r.Value
FROM   AD_Ref_List r
       INNER JOIN xx_insert x
       ON ( ',' || x.XX_DocAction_Next || ',' LIKE '%,' || r.value || ',%' )
WHERE  r.AD_Reference_ID = 1000448
AND    x.xx_insert_id    = 1000283;

この手法により、カンマ区切りのリストに一致する値を識別できます。あるいは、行値フィルタリングを使用したより効率的なアプローチを使用することもできます。

SELECT Value
FROM   AD_Ref_List
WHERE  AD_Reference_ID = 1000448
AND    value IN (
  SELECT REGEXP_SUBSTR( XX_DocAction_Next, '[^,]+', 1, LEVEL )
  FROM   xx_insert
  WHERE  xx_insert_id    = 1000283
  CONNECT BY LEVEL <= REGEXP_COUNT( XX_DocAction_Next, '[^,]+' )
);

どちらのソリューションも、VARCHAR 列を複数の値に効果的に分割し、指定された値に基づいてフィルタリングすることで、最初の段階で発生した問題を解決します。クエリ。

以上がSQL でカンマ区切りの VARCHAR 列を効率的に分割してフィルタリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。