Выполнить второй оператор Select, если первый оператор SQL возвращает NULL (или ничего) - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть два SELECT заявления.Я хочу запустить второй оператор SQL, если первый оператор ничего не возвращает или NULL.

Первый оператор 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.

Любая помощь будет принята:)

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Один метод - это 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 голос
/ 24 сентября 2019

Вы можете сделать это как ЕСЛИ СУЩЕСТВУЕТ пункт, как указано ниже:

   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
...