如果第一个SQL语句返回NULL(或不返回任何值),则运行Second Select语句

时间:2019-09-23 21:19:07

标签: sql sql-server tsql sql-server-2016

我有两个SELECT语句。如果第一条语句不返回任何内容或NULL,我想运行第二条SQL语句。

第一个Select语句:

SELECT 
    k.key_no, concat(k.key_no,'-', key_title) 
FROM
    dbo.ff_keyword k
LEFT JOIN 
    ff_fundkey f ON f.key_no = k.key_no
LEFT JOIN
    ff_fundinfo fi ON fi.fund_no = f.fund_no
WHERE
    f.fund_no = '1'
ORDER BY 
    key_no, key_title
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY

第二条语句:

SELECT 
    k.key_no, concat(k.key_no,'-', key_title) 
FROM 
    dbo.ff_keyword k

我尝试使用ISNULL,但我认为这不是解决方案。无论如何,在SQL Server 2016中可以执行此操作吗?我不确定Case When是否可以解决问题。

ISNULL代码:

SELECT
    ISNULL((SELECT k.key_no, concat(k.key_no,'-', key_title) 
            FROM dbo.ff_keyword k
            LEFT JOIN ff_fundkey f ON f.key_no = k.key_no
            LEFT JOIN ff_fundinfo fi ON fi.fund_no = f.fund_no
            WHERE f.fund_no = '1'
            ORDER BY key_no, key_title
            OFFSET 1 ROWS
            FETCH NEXT 1 ROWS ONLY),
           (SELECT k.key_no, concat(k.key_no,'-', key_title) 
            FROM dbo.ff_keyword k))

这是我使用ISNULL时出现的错误:

  

第16层,状态1,第10行,Msg 116
  如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式。

     

第16层,状态1,第12行,消息116
  如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式。

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:2)

一种方法是CTE:

with first as (
      select k.key_no, concat(k.key_no, '-', key_title) as col
      from dbo.ff_keyword k join
           ff_fundkey f
           on f.key_no = k.key_no left join
           ff_fundinfo fi
           on fi.fund_no = f.fund_no
      where f.fund_no = '1'
      order by key_no, key_title
      offset 1 rows fetch next 1 rows only
     )
select f.* --I think we can only select from first not other tables
from first f
union all
select k.key_no, concat(k.key_no, '-', key_title) 
from dbo.ff_keyword k
where not exists (select 1 from first);

请注意,我将第一个left join更改为内部联接。 where子句仍然会这样做,因此left join会产生误导。

答案 1 :(得分:1)

您可以将其设置为“ IF EXISTS”子句,如下所示:

   IF EXISTS (
        SELECT k.key_no, CONCAT (k.key_no, '-', key_title)
        FROM dbo.ff_keyword k
        LEFT JOIN ff_fundkey f ON f.key_no = k.key_no
        LEFT JOIN ff_fundinfo fi ON fi.fund_no = f.fund_no
        WHERE f.fund_no = '1'
        ORDER BY key_no, key_title OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
        )
BEGIN
    SELECT k.key_no, CONCAT (k.key_no, '-', key_title)
    FROM dbo.ff_keyword k
    LEFT JOIN ff_fundkey f ON f.key_no = k.key_no
    LEFT JOIN ff_fundinfo fi ON fi.fund_no = f.fund_no
    WHERE f.fund_no = '1'
    ORDER BY key_no, key_title OFFSET 1 ROWS

    FETCH NEXT 1 ROWS ONLY
END
ELSE
BEGIN
    SELECT k.key_no, CONCAT (k.key_no, '-', key_title)
    FROM dbo.ff_keyword k
END