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

时间:2018-11-13 04:00:34

标签: sql-server

我认为这可能是一个简单的问题,但是对于非SQL Developer来说,我还是有些固执。

示例我的select语句是这样的。

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

如果year table B中的is null,我想返回table A中的所有行,否则按table B中的值过滤。

现在发生的是,当表B为空时,表A没有返回任何行。

编辑:表B中只有一行,并且可以手动控制表B中的值年份为空或不为空。

4 个答案:

答案 0 :(得分:2)

请勿用作Where Year = (Select Year from table B) 因为如果TableB有多个记录,则上述查询将返回错误。

改为使用此查询;

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

答案 1 :(得分:0)

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

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

如果表B包含多于一行,应该返回什么?一个错误?空集?来自A的行与来自B的year的非空值之一相匹配?来自A的所有行?

通常情况下,说明规格的边缘案例和边缘案例...我们希望对案例进行测试,我们需要知道要测试的内容...然后我们才能开发查询。

有几种满足规范的查询模式;最大的不同将是那些极端情况...表B为空,或表A中的year列为NULL。

我可能会倾向于这样:

 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 Fiddle演示http://sqlfiddle.com/#!9/44c277/1


如果问题实际上与使用WHERE子句有关,请随时用ON替换关键字WHERE

DOH!回顾问题,它询问的是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作为特殊的占位符值,以代替NULL,因此将满足相等性比较。没有特殊的占位符值,我们将不得不合并一些IS NULL条件测试。

答案 2 :(得分:-1)

假设内部查询仅返回单行。

您可以这样做。

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)

我没有测试此查询,但希望您能在这里找到要点。

答案 3 :(得分:-2)

使用ISNULL并将NULL设置为0,例如

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

希望这行得通!