Правильный тип для операнда OpenSQL IN - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть функциональный модуль, который импортирует my_values

my_values - это пользовательский тип внутренней таблицы.

Эта переменная "my_values" содержит, например: ["foo","bar"]

Я хочу выбрать все значения из таблицы Z_MYTAB, где столбец my_col находится в my_values.

Я пробовал это:

SELECT * FROM Z_MYTAB WHERE 
       my_col in @my_values INTO TABLE @DATA(my_rows).

Но это приводит к ошибке:

таблица my_values ​​имеет неправильную структуру строк

(сообщение переведено на английский язык. Оригинал может немного отличаться)

Я мог бы зациклить my_values, но я бы хотел этого избежать.

Как сделать SQL IN с переменными хоста, которые являются внутренними таблицами?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

IN openands могут быть двух типов:

SELECT ... WHERE my_col IN ( value1, value2 , value3)

, в этом случае выражение хоста не может использоваться в качестве правого операнда

SELECT ... WHERE my_col IN sel_tab[]

, в этом случае sel_tab представляет собой диапазон, подобный

Так что вы можете использовать следующее:

DATA sel_tab type range of string.

sel_tab = value #( for ls in my_values ( sign = 'I' option = 'EQ' low = ls ) ).
SELECT * FROM Z_MYTAB WHERE
       my_col in @sel_tab[] INTO TABLE @DATA(my_rows).

С уважением

0 голосов
/ 04 марта 2019

Пользователь JozsefSzikszai указал мне на «ВЫБРАТЬ ДЛЯ ВСЕХ ЗАПИСЕЙ».

Я нашел это в документах:

Для элементарного типа строки должна быть указана псевдо-компонента table_lineдля комп.

См .: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenwhere_logexp_itab.htm

IF my_values is initial.
  exit.
endif.

SELECT * FROM Z_MYTAB
  FOR ALL ENTRIES IN @my_values WHERE
  column_name = @my_values-table_line
  INTO TABLE @DATA(result_rows).
0 голосов
/ 27 февраля 2019

Выбор с помощью IN возможен только с таблицей диапазона .

Преобразование внутренней таблицы в таблицу диапазона можно выполнить следующим образом:

DATA ltr_value TYPE RANGE OF string.

ltr_value  = VALUE #( FOR <my_value> IN my_values
                      ( sign   = 'I'
                        option = 'EQ'
                        low    = <my_value> )
                    ).
...