SQL 从一行中删除不需要的字符并将 table 解析为新的 table

SQL delete unnecessary characters from a row and parse a table into a new table

我创建了以下代码:

with t as (select *,
    case 
    when `2kids`= '1' then '2kids' else'' end as new_2kids,
    case 
    when `3kids`= '1' then '3kids' else'' end as new_3kids,
    case
    when kids= '1' then 'kids' else'' end as kids
    from test.family)
select concat_ws('/',new_2kids, new_3kids, new_kids) as 'nc_kids'
from t;  

如果我运行这个查询我的输出将是:

nc_kids

2kids/new_3kids/ 
2kids// 
/new_3kids/new_kids 
2kids/new_3kids/new_kids

我怎样才能删除所有不必要的没有跟字符的'/'。 例如:

nc_kids

2kids/new_3kids 
2kids
new_3kids/new_kids 
2kids/new_3kids/new_kids

concat_ws() 忽略 nulls,因此您可以在连接时将空字符串转换为 null 值:

select concat_ws('/', 
    nullif(new_2kids, ''), 
    nullif(new_3kids, ''), 
    nullif(new_kids,  '')
) as nc_kids
from t; 

更好的是,修复 case 表达式,使它们首先产生 null 值而不是空字符串:

with t as (
    select f.*,
        case when `2kids`= 1 then '2kids' end as new_2kids,
        case when `3kids`= 1 then '3kids' end as new_3kids,
        case when kids   = 1 then 'kids'  end as kids
    from test.family f
)
select concat_ws('/',new_2kids, new_3kids, new_kids) as nc_kids
from t;