2017-03-15 9 views
-1

カンマで区切られた(順序付けられていない)2つの数字のリストが与えられているので、それらの間の違いだけを抽出したいと思うでしょう(おそらくregexpを使用します)。 例:2つのリスト間のポイント差

l1_additional_data:1069679

l2_additional_data:1005923,1034010,1044261,1048311

どのようにこれをすることができ

select '1010484,1025781,1051394,1069679' as list_1, '1005923,1010484,1025781,1034010,1044261,1048311,1051394' as list_2

私が望む何のような結果であり、完了?

私はVertica、BTWを使用しています。つまり、ここでの階層型(「接続」)クエリを使用できます。

ありがとうございます!

+0

あなたが何かをしようとしたことがあり、またはあなただけに誰かを求めていますあなたの問題を解決する? – NikNik

+0

なぜそんなに厳しい態度ですか?はい、私は試しましたが、VerticaのConnect Byの欠如はこれをはるかに困難な仕事にしました –

+0

私はたぶん私は誇張していますが、あなたの出力で何をしようとしたのか投稿してください。 google/stackの回答を検索してください。この投稿の後にあなたの質問を投稿してください。 – NikNik

答えて

0

が参考になります関連する記事があります - Splitting string into multiple rows in Oracle

私はにVerticaを知らない

が、Oracleに基づいてあなたがして行くことができる:

with list1 as 
(
select 
regexp_substr(list_1 ,'[^,]+', 1, level) as list_1_rows 
from (
select 
'1010484,1025781,1051394,1069679' as list_1 
from dual) 
connect by 
    regexp_substr(list_1 ,'[^,]+', 1, level) is not null), 

list2 as (select 
regexp_substr(list_2 ,'[^,]+', 1, level) as list_2_rows 
from (
select 
'1005923,1010484,1025781,1034010,1044261,1048311,1051394' as list_2 
from dual) 
connect by regexp_substr(list_2 ,'[^,]+', 1, level) is not null) 

select * from list1 
full outer join list2 
on list1.list_1_rows = list2.list_2_rows 
where list_1_rows is null or list_2_rows is null 
0

OKは、ここに私のソリューションです - しかし、それは非常にではありません効率的で、そしてそれはおそらく(パフォーマンスの面で)スケールません。

WITH lists AS (SELECT'1010484,1025781,1051394,1069679' AS list_1, '1005923,1010484,1025781,1034010,1044261,1048311,1051394' AS list_2) , numbers AS (SELECT row_number() over() i FROM system_columns limit 100) SELECT group_concat(parsed_code_1) list_1_additions, group_concat(parsed_code_2) list_2_additions FROM(SELECT parsed_code_1 FROM(SELECT split_part(list_1, ',', i) parsed_code_1 FROM lists CROSS JOIN numbers WHERE i <= regexp_count(list_1, ',')+1) l WHERE parsed_code_1 IS NOT NULL) a FULL OUTER JOIN (SELECT parsed_code_2 FROM(SELECT split_part(list_2, ',', i) parsed_code_2 FROM lists CROSS JOIN numbers WHERE i <= regexp_count(list_2, ',')+1) l WHERE parsed_code_2 IS NOT NULL) b ON(parsed_code_1 = parsed_code_2) WHERE parsed_code_1 IS NULL OR parsed_code_2 IS NULL

関連する問題