You don't have to make it so complex. NULL would be anyway handled implicitly and won't be considered, you just need to take care of the delimiter that you are using to concatenate the strings. TRIM should do the job.
SQL> WITH DATA AS(
2 SELECT 1 A, 2 b, 3 c FROM dual UNION ALL
3 SELECT NULL A, NULL b, NULL c FROM dual UNION ALL
4 SELECT 1 A, NULL b, NULL c FROM dual UNION ALL
5 SELECT 1 A, 2 b, NULL c FROM dual
6 )
7 SELECT TRIM(both '-' FROM A||'-'||b||'-'||c) str FROM DATA;
STR
----------------------------------------------------------------
1-2-3
1
1-2
SQL>
If you want to exclude the NULL values, then add a NOT NULL filter to the predicate.
SQL> WITH DATA AS(
2 SELECT 1 A, 2 b, 3 c FROM dual UNION ALL
3 SELECT NULL A, NULL b, NULL c FROM dual UNION ALL
4 SELECT 1 A, NULL b, NULL c FROM dual UNION ALL
5 SELECT 1 A, 2 b, NULL c FROM dual
6 )
7 SELECT str
8 FROM
9 ( SELECT TRIM(BOTH '-' FROM A||'-'||b||'-'||c) str FROM DATA
10 )
11 WHERE str IS NOT NULL;
STR
-------------------------------------------------------------------
1-2-3
1
1-2
SQL>
Update case when the middle column is NULL and other columns are not null.
SQL> WITH DATA AS(
2 SELECT 1 A, 2 b, 3 c FROM dual UNION ALL
3 SELECT NULL A, NULL b, NULL c FROM dual UNION ALL
4 SELECT 1 A, NULL b, NULL c FROM dual UNION ALL
5 SELECT 1 A, 2 b, NULL c FROM dual UNION ALL
6 SELECT 1 A, NULL b, 3 c FROM dual
7 )
8 SELECT REPLACE(str, '--', '-') str
9 FROM
10 ( SELECT TRIM(BOTH '-' FROM A||'-'||b||'-'||c) str FROM DATA
11 )
12 WHERE str IS NOT NULL;
STR
-------------------------------------------------------------------
1-2-3
1
1-2
1-3
SQL>