1

まったく同じフォーマット「1,2,3,4;5,6,7,8」でデータを保持する2つの列(c1、c2)を持つテーブル「my_table」があります。regexp_split_to_tableを使用してそれらを行に分割します。空でない行を選択しようとしています。

SELECT * from 
 (SELECT '1' as param1 ,'2' as param2, param3 FROM
  ((select regexp_split_to_table(my_table.c1, ';') as param3
   FROM  my_table)
 UNION
  (select regexp_split_to_table(my_table.c2, ';') as param3
   FROM  my_table)) AS a) as b

 where param3 is not null

このクエリを実行すると、次のエラーが発生します。

set-valued function called in context that cannot accept a set

ユニオンを削除して列の 1 つからのみ選択するか、他のフィールド (param1/param2) のいずれかでフィルター処理すると、クエリは機能します。データに問題があるのではないかと思ったので、同じ列から 2 回選択してみました。

SELECT * from 
 (SELECT '1' as param1 ,'2' as param2, param3 FROM
  ((select regexp_split_to_table(my_table.c1, ';') as param3
   FROM  my_table)
 UNION
  (select regexp_split_to_table(my_table.c1, ';') as param3
   FROM  my_table)) AS a) as b

 where param3 is not null

それでも同じエラーが発生します。誰もこれを解決する方法を知っていますか? ありがとう!

4

1 に答える 1

3

サブクエリの代わりに CTE を使用し、クエリをフォーマットすることをお勧めします。必要だと思うクエリは次のとおりです。

with cte1 as (
  select regexp_split_to_table(t.c1, ';') as param3
  from my_table as t
  union all
  select regexp_split_to_table(t.c2, ';') as param3
  from my_table as t
)
select '1' as param1 ,'2' as param2, c.param3
from cte1 as c
where c.param3 is not null

SQL フィドルのデモ

注:クエリで重複が必要かどうかはわかりません。必要がない場合は、union代わりに使用してくださいunion all

アップデート

with cte1 as (
  select regexp_split_to_table(t.c1, ';') as param3
  from my_table as t
  union all
  select regexp_split_to_table(t.c2, ';') as param3
  from my_table as t
), cte2 as (
  select regexp_split_to_table(c.param3, ',') as param3
  from cte1 as c
  where c.param3 is not null and c.param3 <> ''
)
select *
from cte2 as c
where c.param3 is not null and c.param3 <> ''

SQL フィドルのデモ

update2 1つの正規表現でも実行できます

with cte1 as (
    select c1 as param3 from my_table
    union all
    select c2 as param3 from my_table
), cte2 as (
  select regexp_split_to_table(param3, '(;|,)') as param3
  from cte1
)
select '1' as param1 ,'2' as param2, c.param3
from cte2 as c
where nullif(c.param3, '') <> ''

SQL フィドルのデモ

于 2013-08-12T10:01:50.473 に答える