【问题标题】:Run Second Select statement if the first SQL statement return NULL(or nothing)如果第一个 SQL 语句返回 NULL(或什么都不返回),则运行第二个 Select 语句
【发布时间】:2019-09-23 21:19:07
【问题描述】:

我有两个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时的错误:

消息 116,第 16 级,状态 1,第 10 行
当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

消息 116,第 16 级,状态 1,第 12 行
当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

任何帮助将不胜感激:)

【问题讨论】:

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


    【解决方案1】:

    一种方法是 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 具有误导性。

    【讨论】:

    • 非常感谢您的帮助。我试过了,但有一个错误说'Msg 107, Level 15, State 1, Line 12 列前缀'f'与查询中使用的表名或别名不匹配。'
    • 我想我不能使用 CTE 中的别名
    • 我已将 'f' 更改为 'first' :)
    【解决方案2】:

    您可以将其设置为 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
    

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2013-11-29
      • 2015-08-03
      相关资源
      最近更新 更多