计算以逗号分隔的不同值
Count distinct values separated by a comma
我有这个 table 叫做 test
id
my_list
1
aa//11,aa//34,ab//65
2
bb//43, bb//43, be//54
3
4
cc//76
我想计算 my_list
中的不同值,其中列表中的每个项目都用逗号分隔。在这种情况下:
id=1
将有 3
个不同的值
id=2
将有 2
个不同的值,如 bb//43
显示两次,因此有 2 个不同的值
id=3
将具有 0
个不同的值,因为它是一个空列表
id=4
将有 1
因为列表中只有 1 个项目
我想在 SQL 中完成此操作,而不是使用自定义程序。我尝试使用下面的语句,但它显示 1.
SELECT id, COUNT(DISTINCT my_list) as my_count
FROM test;
预期结果:
id
my_count
1
3
2
2
3
0
4
1
你需要把你的列表变成table到count distinct
里面。以json_table
为例。
with a(id, my_list) as (
select 1, 'aa//11, aa//34, ab//65' from dual union all
select 2, 'bb//43, bb//43, be//54' from dual union all
select 3, null from dual union all
select 4, 'cc//76' from dual
)
select
id
, (
select count(distinct val)
from json_table(
/*Replace comma with quotes and comma: ','
And wrap with array brackets
*/
'[''' || regexp_replace(my_list, '\s*,\s*', ''',''') || ''']'
, '$[*]'
columns ( val varchar(20) path '$')
)
) as cnt
from a
ID | CNT
-: | --:
1 | 3
2 | 2
3 | 0
4 | 1
db<>fiddle here
我有这个 table 叫做 test
id | my_list |
---|---|
1 | aa//11,aa//34,ab//65 |
2 | bb//43, bb//43, be//54 |
3 | |
4 | cc//76 |
我想计算 my_list
中的不同值,其中列表中的每个项目都用逗号分隔。在这种情况下:
id=1
将有3
个不同的值id=2
将有2
个不同的值,如bb//43
显示两次,因此有 2 个不同的值id=3
将具有0
个不同的值,因为它是一个空列表id=4
将有1
因为列表中只有 1 个项目
我想在 SQL 中完成此操作,而不是使用自定义程序。我尝试使用下面的语句,但它显示 1.
SELECT id, COUNT(DISTINCT my_list) as my_count
FROM test;
预期结果:
id | my_count |
---|---|
1 | 3 |
2 | 2 |
3 | 0 |
4 | 1 |
你需要把你的列表变成table到count distinct
里面。以json_table
为例。
with a(id, my_list) as ( select 1, 'aa//11, aa//34, ab//65' from dual union all select 2, 'bb//43, bb//43, be//54' from dual union all select 3, null from dual union all select 4, 'cc//76' from dual ) select id , ( select count(distinct val) from json_table( /*Replace comma with quotes and comma: ',' And wrap with array brackets */ '[''' || regexp_replace(my_list, '\s*,\s*', ''',''') || ''']' , '$[*]' columns ( val varchar(20) path '$') ) ) as cnt from a
ID | CNT -: | --: 1 | 3 2 | 2 3 | 0 4 | 1
db<>fiddle here