Oracleでの文字列連結:初心者から上級者向けチュートリアル
Oracleで複数の行の列値を連結するSQLクエリ
このチュートリアルでは、Oracleデータベースで複数の行の列値を連結する方法について説明します。さまざまな方法がありますが、ここでは最も一般的で便利な2つの方法をご紹介します。
方法1: CONCAT 関数を使用する
CONCAT
関数は、文字列を連結するために使用される最も基本的な関数です。複数の列値を連結するには、次のように使用します。
SELECT CONCAT(col1, col2, ..., colN) AS combined_column
FROM your_table;
例:
次の表 customers
があるとします。
customer_id | first_name | last_name |
---|---|---|
1 | John | Doe |
2 | Jane | Smith |
3 | Peter | Jones |
上記のクエリを実行すると、次の結果が得られます。
| combined_column | |---|---| | John Doe | | Jane Smith | | Peter Jones |
LISTAGG
関数は、複数の値をカンマ区切りのリストとして連結するために使用されます。区切り文字とその他のオプションを指定することもできます。
SELECT LISTAGG(col1 || col2 || ..., ', ') WITHIN GROUP (ORDER BY col1, col2, ...) AS combined_column
FROM your_table;
上記の例と同じ customers
テーブルを使用して、次のようにクエリを記述できます。
SELECT LISTAGG(first_name || ' ' || last_name, ', ') WITHIN GROUP (ORDER BY first_name, last_name) AS full_name
FROM customers;
補足事項
- 上記の例では、
col1
、col2
、... を実際の列名に置き換える必要があります。 - 複数の行を連結するだけでなく、1つの行の複数の列を連結することもできます。
CONCAT
関数は、NULL値を処理しないことに注意してください。NULL値を含む列を連結する場合は、LISTAGG
関数を使用することをお勧めします。- 連結された列の長さに制限があることに注意してください。制限を超える場合は、エラーが発生する可能性があります。
SELECT LISTAGG(first_name || ' ' || last_name, ', ') WITHIN GROUP (ORDER BY first_name, last_name) AS full_name
FROM customers;
このコードの説明:
SELECT
: この句は、クエリから返される列を指定します。この例では、full_name
という名前の列を返します。LISTAGG
: この関数は、複数の値をカンマ区切りのリストとして連結するために使用されます。first_name || ' ' || last_name
: この式は、顧客のファーストネーム、スペース、ラストネームを連結します。WITHIN GROUP (ORDER BY first_name, last_name)
: この句は、LISTAGG
関数が各顧客グループに対して個別に実行されることを指定します。顧客は、ファーストネームとラストネームで昇順にソートされます。FROM customers
: この句は、クエリで使用される表を指定します。この例では、customers
テーブルを使用します。
- このコードは、Oracle 11g以降で使用できます。
Oracleで複数の行の列値を連結するその他の方法
方法3: DBMS_UTILITY.TO_CHAR 関数と GROUP BY 句を使用する
この方法は、数値列を連結する場合に役立ちます。
SELECT
SUBSTR(TO_CHAR(GROUP_CONCAT(col1), '99999'), 1, LENGTH(TO_CHAR(col1))) AS combined_column
FROM your_table
GROUP BY ...;
方法4:再帰クエリを使用する
WITH RECURSIVE cte (
customer_id,
first_name,
last_name,
next_customer_id
) AS (
SELECT
customer_id,
first_name,
last_name,
LEAD(customer_id) OVER (ORDER BY customer_id) AS next_customer_id
FROM customers
WHERE customer_id IS NULL OR customer_id = (SELECT MIN(customer_id) FROM customers)
UNION ALL
SELECT
c.customer_id,
c.first_name,
c.last_name || ' ' || n.first_name,
n.customer_id
FROM cte c
JOIN cte n ON c.next_customer_id = n.customer_id
)
SELECT first_name || ' ' || last_name AS combined_column
FROM cte
WHERE customer_id IS NULL;
方法5:ピボット表を使用する
SELECT
*
FROM your_table
PIVOT (
MAX(col1) AS combined_column
FOR col2 IN (
SELECT DISTINCT col2
FROM your_table
)
);
上記の方法に加えて、Oracleには、XML型やJSON型のデータ操作に役立つその他の関数も用意されています。
最適な方法の選択
使用する方法は、要件によって異なります。単純な連結操作の場合は、CONCAT
関数または LISTAGG
関数が最適です。より複雑な操作の場合は、再帰クエリやピボット表を使用する方が効率的な場合があります。
sql oracle string-aggregation