代码之家  ›  专栏  ›  技术社区  ›  xChaax

如果另一个表的值为空,如何使用where子句

  •  0
  • xChaax  · 技术社区  · 6 年前

    我认为这可能是一个简单的问题,但我有点执着于一个非sql开发人员。

    示例我的select语句如下。

    Select ID, Year
    From Table A
    Where Year = (Select Year from table B)
    

    如果 year table B is null ,我想返回 table A 否则按值筛选 表B

    现在,当表B为空时,表A将不返回任何行。

    编辑:B表只有一行,从B表起的值年可以手工控制为空或不为空。

    4 回复  |  直到 6 年前
        1
  •  2
  •   Dumi    6 年前

    不要用 Where Year = (Select Year from table B) 因为如果table有多个记录,那么上面的查询将返回一个错误。

    改为使用此查询;

    SELECT TA.ID, TA.Year
    FROM TableA TA
    LEFT JOIN TableB TB ON TB.Year = TA.Year
    

    更新: 根据您对问题所做的更新,查询将是;

    SELECT TA.ID, TA.Year
    FROM TableA TA
    WHERE TA.Year= (Select Year from table B)
    OR (Select Year from table B) IS NULL
    
        2
  •  0
  •   spencer7593    6 年前

    一个表总是只有一行的规范有点奇怪。它不是无效的,但它是不寻常的。

    如果表B为空,如果它包含零行,那么查询应该返回什么?一个错误?一套空的?或者是A的所有行?

    如果表B包含多行,应该返回什么?一个错误?一套空的?A中与B中年份的非空值之一匹配的行?A的所有行?

    最常见的情况是,它的边盒和角盒说明了规范…我们希望这些案子能被检验,我们需要知道要检验什么…然后我们可以开发一个查询。

    有几个查询模式可以满足规范;最大的区别是那些边缘情况…表B为空,或表A中的年份列为空。

    我可能倾向于这样做:

     SELECT a.id
          , a.year
       FROM ( SELECT MAX(b.year) AS year
                FROM table_b b
            ) v
       JOIN table_a a
         ON a.year <=> IFNULL(v.year,a.year)
    

    SQL小提琴演示 http://sqlfiddle.com/#!9/44c277/1


    如果问题实际上是关于使用 WHERE 子句,然后可以随意替换关键字 ON 具有 哪里 .

    呸! 回顾这个问题,它问的是sql server,而不是mysql。上面的语法是针对mysql的。对于SQL Server,则如下所示:

     SELECT a.id
          , a.year
       FROM ( SELECT MAX(b.year) AS year
                FROM table_b b
            ) v
       JOIN table_a a
         ON COALESCE(a.year,-1) = COALESCE(v.year,a.year,-1)
    

    我们正在使用 -1 作为一个特殊的占位符值,作为空值的替换,这样就可以满足相等比较的要求。如果没有特殊的占位符值,我们将不得不合并一些 IS NULL 条件测试。

        3
  •  -1
  •   Waqas Shabbir    6 年前

    假设您的内部查询只返回一行。

    你可以这样做。

    SELECT ID, Year
    FROM TableA
    WHERE Year = 
                 (
                     SELECT Year 
                     FROM TableB
                 )
    OR Year IS NULL
    

    至于“如果表B中的年份为空,则返回表A中的所有行,否则按表B中的值筛选”这一行,请使用以下查询

    SELECT ID, Year
    FROM TableA
    WHERE NVL(Year, '0') = (CASE WHEN (SELECT Year FROM TableB) IS NOT NULL THEN (SELECT Year FROM TableB) ELSE NVL(Year, '0') END)
    

    我没有测试这个查询,但希望您能理解这一点。

        4
  •  -2
  •   anand jhawar    6 年前

    使用isnull并将null设置为0

    选择ID,年份 从表A 其中year=(从表B中选择isnull(year,0)

    希望能成功!