Mysql 从查询中筛选空值

Mysql 从查询中筛选空值,mysql,Mysql,在下面的查询中,我只想看到风险列中没有空值的行 SELECT table1.id, table1.name, CASE WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high' WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low' ELSE (SELECT table2.risk FROM table2 W

在下面的查询中,我只想看到风险列中没有空值的行

SELECT table1.id, table1.name,
   CASE 
     WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high'
     WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low'
     ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value
           ORDER BY table2.value DESC LIMIT 1)
   END AS risk
FROM table1
ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC
我想去掉空的

SELECT id, name, risk FROM (
  SELECT table1.id, table1.name,
   CASE 
     WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high'
     WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low'
     ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value
           ORDER BY table2.value DESC LIMIT 1)
   END AS risk
  FROM table1
  ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC
) T
WHERE risk IS NOT NULL
更新:我刚刚意识到这是MySQL,而不是一般的SQL问题,所以我不能100%确定MySQL支持这个子查询语法。因此,MySQL方法:

  SELECT table1.id, table1.name,
   CASE 
     WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high'
     WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low'
     ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value
           AND table2.risk IS NOT NULL
           ORDER BY table2.value DESC LIMIT 1)
   END AS risk
  FROM table1
  ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC

因此,筛选是在前面完成的,这可能会使用索引,尽管一个好的优化器会将第一个查询转移到第二个查询。

您应该能够使用HAVING子句筛选出这些行:

选择table1.id、table1.name、, 案例 当table1.event='r'和table1.name='jones'时,则为'very high' 当table1.event='t'和table1.name='smith'时,则为'very low' 其他的 选择表2.2风险
在表2中,我检查了查询,但没有得到正确的结果,而是得到了可重复的行。我用原始查询的结果更新问题。
  SELECT table1.id, table1.name,
   CASE 
     WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high'
     WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low'
     ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value
           AND table2.risk IS NOT NULL
           ORDER BY table2.value DESC LIMIT 1)
   END AS risk
  FROM table1
  ORDER BY FIELD( table1.event, 'r', 'f', 't' ), table1.value DESC
SELECT * FROM user where name=""