У вас нет проблем с полями NULL, потому что CONCAT_WS пропустит значения NULL (вместе с разделителем). Что касается пустых строк (которые не будут пропущены), вы можете просто превратить их в NULL, прежде чем делать это. Если вы не можете обновить саму базу данных, сделайте запрос вроде:
select <your expression> from (select case when col1 = '' then null else col1 end as col1 from my_table);
так, просто конвертируйте его в null на лету и сделайте свой выбор из этого внутреннего запроса.
Чтобы сделать это, вам нужно будет использовать nullif, поэтому вместо:
CONCAT_WS(a, CONCAT_WS(c, d))
использовать
NULLIF(CONCAT_WS(a, NULLIF(CONCAT_WS(c, d), '')), '')
Я не думаю, что вы найдете более быстрый способ сделать это. Другой вариант может состоять в том, чтобы просто выбрать эти поля и затем выполнить конкатенацию на стороне PHP, но это возможно только в том случае, если полученная конкатенация не является частью какого-либо предложения WHERE в дальнейшем в вашем запросе.