You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LISTAGG函数中处理空值,替换为'no actors'并消除多余点

解决LISTAGG拼接时的多余点及空值显示问题

解决单个演员拼接的多余点问题

当first_name为空时,直接拼接. 会产生多余的点,用CASE语句可以精准控制每个演员的显示格式:

SELECT 
  length, 
  title, 
  LISTAGG(
    CASE 
      WHEN first_name IS NOT NULL THEN SUBSTR(first_name, 1, 1) || '. ' || last_name
      ELSE last_name
    END, 
    ', '
  ) WITHIN GROUP (ORDER BY last_name) AS ACTORS
FROM film 
INNER JOIN film_actor USING (film_id)
INNER JOIN actor USING (actor_id)
WHERE release_year = 1991
GROUP BY title, length
ORDER BY length DESC;

逻辑说明:

  • 当first_name不为空时,正常显示「首字母. 姓氏」格式
  • 当first_name为空时,仅显示姓氏,避免多余的点

当存在空first_name的演员时,整体显示'no actors'

如果需求是只要某部电影有演员的first_name为空,就将ACTORS列统一显示为'no actors',可以在分组后用CASE结合COUNT判断是否存在空值:

SELECT 
  length, 
  title, 
  CASE 
    WHEN COUNT(CASE WHEN first_name IS NULL THEN 1 END) > 0 THEN 'no actors'
    ELSE LISTAGG(SUBSTR(first_name, 1, 1) || '. ' || last_name, ', ') WITHIN GROUP (ORDER BY last_name)
  END AS ACTORS
FROM film 
INNER JOIN film_actor USING (film_id)
INNER JOIN actor USING (actor_id)
WHERE release_year = 1991
GROUP BY title, length
ORDER BY length DESC;

包含无演员的电影并显示'no actors'

原查询用INNER JOIN会过滤掉没有演员的电影,如果需要包含这类电影并显示'no actors',需要改成LEFT JOIN,再用NVL处理空的聚合结果:

SELECT 
  f.length, 
  f.title, 
  NVL(
    LISTAGG(
      CASE 
        WHEN a.first_name IS NOT NULL THEN SUBSTR(a.first_name, 1, 1) || '. ' || a.last_name
        ELSE a.last_name
      END, 
      ', '
    ) WITHIN GROUP (ORDER BY a.last_name), 
    'no actors'
  ) AS ACTORS
FROM film f
LEFT JOIN film_actor fa USING (film_id)
LEFT JOIN actor a USING (actor_id)
WHERE f.release_year = 1991
GROUP BY f.title, f.length
ORDER BY f.length DESC;

内容的提问来源于stack exchange,提问作者yyds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:20:41