выберите * где условие1, но если отсутствует, где условие2 - PullRequest
2 голосов
/ 30 сентября 2019

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

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' все в одном запросе к БД и без обработки на стороне приложения?

Ответы [ 3 ]

4 голосов
/ 01 октября 2019

Для этой задачи вы можете использовать оператор 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).
1 голос
/ 04 октября 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).
1 голос
/ 02 октября 2019

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

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