如果找不到行,请使用第二个条件

问题描述 投票:3回答:3

我有以下选择:

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的文本,但是如果它们不存在,那么在向DB发出的一个请求中选择全部带有lang = 'E'的文本,并且在应用程序端不进行任何处理?

sap abap hana opensql
3个回答
4
投票

您可以使用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
投票

我喜欢这种事情的合并(它将用第一个非null值填充您的目标)。您可以将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).

1
投票

基于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).
© www.soinside.com 2019 - 2024. All rights reserved.