OpenSQL IN操作数的正确类型

时间:2019-02-27 14:37:29

标签: sap abap opensql

我有导入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 :(得分:3)

只有在range表中才能使用IN进行选择。

可以将内部表转换为范围表:

DATA ltr_value TYPE RANGE OF string.

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

答案 1 :(得分:3)

在openands中可以有2种类型:

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

最诚挚的问候

答案 2 :(得分:2)

用户JozsefSzikszai指示我指向“选择所有条目”。

我在文档中找到了这个

  

对于基本行类型,必须为comp指定伪组件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).