Вместо этого используйте второе условие, если строки не найдены

У меня есть следующий выбор:

SELECT name, text, lang FROM texts
  WHERE name IN @r_names
    AND lang IN ( @lv_lang, 'E' )
  INTO TABLE @DATA(lt_texts).

Он будет выбирать тексты нескольких строк текстов для данного имени.

Как сказать, что я хочу тексты с lang = lv_lang, но если их нет, то выбрать с lang = 'E' все в одном запросе к БД и без обработки на стороне приложения?


person kdobrev    schedule 30.09.2019    source источник
comment
Я чувствую, что это проще сделать, удалив соседние дубликаты, чем изменив запрос, но я подожду, пока другие ответят, если у них есть какое-либо решение для этого.   -  person Pavan Kumar Polavarapu    schedule 30.09.2019


Ответы (3)


Вы можете использовать оператор UNION для этой задачи:

SELECT name, text, lang FROM texts
 WHERE name IN @r_names
   AND lang = @lv_lang
UNION
SELECT name, text, lang FROM texts
 WHERE name IN @r_names
   AND lang = 'E'
 AND NOT EXISTS ( SELECT name
                  FROM texts
                  WHERE name IN @r_names
                  AND lang = @lv_lang
                )
INTO TABLE @DATA(lt_texts).
person Suncatcher    schedule 30.09.2019
comment
UNION с 7.50 и EXISTS (с тех пор ) - person Sandra Rossi; 01.10.2019
comment
Два других ответа выполняются значительно быстрее - person András; 12.10.2019

Мне нравится объединение для такого рода вещей (он заполнит вашу цель первым ненулевым значением). Вы можете использовать sy-langu по умолчанию и другие языки в порядке приоритета:

SELECT SINGLE coalesce( default~eqktx, greek~eqktx, english~eqktx )
  FROM equi AS e LEFT OUTER JOIN eqkt AS default
                 ON  default~equnr = e~equnr
                 AND default~spras = @sy-langu
                 LEFT OUTER JOIN eqkt AS greek
                 ON  greek~equnr = e~equnr
                 AND greek~spras = 'G'
                 LEFT OUTER JOIN eqkt AS english
                 ON  english~equnr = e~equnr
                 AND english~spras = 'E'
  WHERE e~equnr = @ls_equi-equnr
   INTO @DATA(lv_eqktx).

Ваш пример станет:

SELECT coalesce( default~name, english~name ),
       coalesce( default~text, english~text ),
       coalesce( default~lang, english~lang )
  FROM texts AS default LEFT OUTER JOIN texts AS english
                        ON  english~name = default~name
                        AND english~lang = 'E'
  WHERE default~name IN @r_names
    AND default~lang = @lv_lang
  INTO TABLE @DATA(lt_texts).
person Pilot    schedule 02.10.2019

На основе ответа Suncatcher, но без UNION. Не пробовал, поэтому не знаю, работает ли это так, как ожидалось:

SELECT name, text, lang FROM texts
 WHERE name IN @r_names
 AND ( lang = @lv_lang
       OR ( NOT EXISTS ( SELECT name
                         FROM texts
                         WHERE name IN @r_names
                         AND lang = @lv_lang
                       )
              AND lang = 'E'
          )        
       )
 INTO TABLE @DATA(lt_texts).
person Albert    schedule 04.10.2019