【问题标题】:Check if subquery is NULL检查子查询是否为 NULL
【发布时间】:2014-04-10 22:05:55
【问题描述】:

我有这个问题:

SELECT sid FROM (SELECT * FROM myTable WHERE keyword='tank') AS InnerTmp LIMIT 1

有时内部查询为 NULL。我想用 0 替换 NULL。我试过了,但它不起作用:

SELECT sid FROM (SELECT IFNULL(sid,0) AS sid FROM myTable WHERE keyword='tank') AS InnerTmp LIMIT 1

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    您的意思是当没有关键字='tank' 的行时,子查询将返回零行?

    这里有一种解决方法:使用外连接,这样您至少可以获得一行,并将其与关键字='tank' 的行集相匹配。如果没有这样的行,它仍然从外连接的另一侧返回一行。然后您可以使用 COALESCE() 将 sid 默认为虚拟零值。

    SELECT sid FROM (
      SELECT COALESCE(myTable.sid, t.placeholder) AS sid
      FROM (SELECT 0 AS placeholder) AS t 
      LEFT OUTER JOIN myTable ON keyword='tank'
    ) AS InnerTmp LIMIT 1
    

    【讨论】:

      【解决方案2】:

      问题是您只测试sid 是否为NULL,如果是则SELECT 0,但如果不是,您也选择0。这是因为如果不满足 IFNULL 条件,它会返回 0 (FALSE)。

      您必须使用IF 子句并检查ISNULL(sid) 是否为1 (TRUE)。如果是这样,那么SELECT 0 否则SELECT sid。

      SELECT sid FROM (
          SELECT IF(ISNULL(sid), 0, sid) FROM myTable WHERE keyword='tank') AS InnerTmp
          LIMIT 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 2023-03-21
        • 2011-01-31
        • 2014-03-24
        • 2014-07-16
        • 1970-01-01
        相关资源
        最近更新 更多