Sql:如果已填充或为空

时间:2018-03-03 06:36:47

标签: sql-server

我有两张桌子。 首先称为TempIds,它只包含一个名为Id的列,其类型为int

TempIds:

Id
45
34
77

第二个叫做国家,有两列,Id和Name 国家:

Id      Name
22      Austria
45      Germany
88      China
12      Japan

我想要的是从Country表中选择与TempIds表中的Ids匹配的所有行。但问题是,如果TempIds为空,则查询应返回来自Countries的所有行。

到目前为止,这是我尝试过的:

select *
from Countries c
left join TempIds t on c.Id = t.Id or t.Id is null


select *
from Countries c
left join TempIds t on c.Id = t.Id
where (c.Id = t.Id or t.Id is null)

上述两个查询都不会返回正确的记录。我的问题是,如何编写一个返回正确结果的查询。也就是说,根据目前的TempIds表,我应该只得到德国。但是如果TempIds是空的,那么我应该从Countries表中获取所有国家。

谢谢是提前

3 个答案:

答案 0 :(得分:2)

非常基本但可以尝试: - >

SELECT c.* 
FROM 
   countries c LEFT OUTER JOIN tempids t 
      ON c.id = t.id
WHERE
   t.id is not null 
   OR NOT EXISTS (SELECT 1 FROM tempids)

另一种选择: - >

WITH CTE as 
(
   SELECT 
     c.id, c.name, t.id as t_id 
   FROM
      countries c LEFT OUTER JOIN tempids t 
         on c.id = t.id
)
SELECT * 
FROM CTE
WHERE
   t.id is not null
   OR NOT EXIST (
      SELECT 1 
      FROM cte 
      WHERE t_id is not null 
   )

或者非常简单,首先检查一下tempid的表计数然后决定查询: - >

IF exists(select 1 from tempid)
BEGIN
  SELECT c.* 
  FROM 
     countries c INNER JOIN tempids t 
       ON c.id = t.id
END
ELSE
BEGIN
   SELECT * from countries
END

请不要介意格式化。

答案 1 :(得分:0)

  

从Countries表中选择与TempIds表中的Ids匹配的所有行。但问题是,如果TempIds为空,则查询应返回来自Countries的所有行。

听起来你应该编写IF条件来检查场景,并根据它运行适当的查询。

类似的东西,

IF EXISTS (SELECT 1 FROM TempIds t INNER JOIN Countries c ON c.ID = t.ID)
BEGIN
    -- TempIDs has at least one record that maps to countries.
    SELECT c.*
    FROM TempIds t 
    INNER JOIN Countries c 
    ON c.ID = t.ID
END
ELSE
BEGIN
    SELECT *
    FROM Countries
END

答案 2 :(得分:0)

如果TempIds null

,请使用UNION运算符与CROSS JOIN获取所有国家/地区
SELECT c.id, c.name FROM Countries c
LEFT JOIN TempIds t on c.id = t.id
UNION
SELECT t.id, c.name FROM TempIds t, Countries c
WHERE t.id IS NULL