我认为这可能是一个简单的问题,但是对于非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中的值年份为空或不为空。
答案 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))
希望这行得通!