为什么else / others(null)出现在我的查询中

问题描述 投票:0回答:1

我试图在脚本下运行,并且只能获得有“!,@和#”的记录。但是,为什么会出现空记录?

SELECT 
    CASE WHEN NAME LIKE ('%!%') THEN '!'
        WHEN NAME LIKE ('%@%') THEN '@'
        WHEN NAME LIKE ('%#%') THEN '#'
    END AS SPECIAL_CHARACTERS, COUNT (1) AS TOTAL
FROM 
    PERSONAL_DETAILS
GROUP BY
    CASE WHEN NAME LIKE ('%!%') THEN '!'
        WHEN NAME LIKE ('%@%') THEN '@'
        WHEN NAME LIKE ('%#%') THEN '#'
    END

特殊字符

(null)  227783
!       8
@       13
#       9
sql oracle
1个回答
2
投票

你的CASE没有ELSE,所以非匹配被分配NULL

如果您不想要它们,请在WHERE子句中使用过滤器:

SELECT (CASE WHEN NAME LIKE '%!%' THEN '!'
             WHEN NAME LIKE '%@%' THEN '@'
             WHEN NAME LIKE '%#%' THEN '#'
        END) AS SPECIAL_CHARACTERS,
       COUNT(*) AS TOTAL
FROM PERSONAL_DETAILS
WHERE NAME LIKE '%!%' OR NAME LIKE '%@%' OR NAME LIKE '%#%'
GROUP BY (CASE WHEN NAME LIKE '%!%' THEN '!'
               WHEN NAME LIKE '%@%' THEN '@'
               WHEN NAME LIKE '%#%' THEN '#'
          END);

笔记:

  • 这只返回第一个匹配的字符。因此,如果名称包含“!”和“#”,它只会算作“!”。如果你想要一个完整的计数,那么问另一个问题。
  • LIKE模式周围不需要括号。
  • WHERE条件可以用REGEXP_LIKE(NAME< '[!@#]')取代。
© www.soinside.com 2019 - 2024. All rights reserved.