Abap 字段具有多个值的sql select语句

Abap 字段具有多个值的sql select语句,abap,opensql,Abap,Opensql,我的选择屏幕上几乎没有复选框。每个复选框对应一个表字段可以接受的值。然后,我必须启动一个select查询,在该查询中,表的某个特定字段可以包含选中其相应复选框的所有值 假设我有5个对应于值a1-a5的复选框。 现在,如果选中复选框1、3和4,则表的字段可以具有值a1、a3或a4 select * from table where field = a1 or field = a2 or field = a3. 一种方法是创建5个变量,然后执行类似的操作 if checkbox1 checked

我的选择屏幕上几乎没有复选框。每个复选框对应一个表字段可以接受的值。然后,我必须启动一个select查询,在该查询中,表的某个特定字段可以包含选中其相应复选框的所有值

假设我有5个对应于值a1-a5的复选框。 现在,如果选中复选框1、3和4,则表的字段可以具有值a1、a3或a4

select * from table where field = a1 or field = a2 or field = a3.
一种方法是创建5个变量,然后执行类似的操作

if checkbox1 checked
  then var1 = a1
else
  var1 = '0'    //something which would never occur in the field of the table
select * from table where field IN (a1,a2,a3 ...)
对于所有复选框,依此类推

然后

select * from table where field = var1 or field = var2 or field = var3 or field = var4 or field = var5.
如果有15个复选框,这将变得很困难。 有更好的方法吗?

像这样试试

if checkbox1 checked
  then var1 = a1
else
  var1 = '0'    //something which would never occur in the field of the table
select * from table where field IN (a1,a2,a3 ...)
为此,请使用以下选项:

DATA field_range TYPE RANGE OF data_type_of_table_field.

IF p_check1 = abap_true.
  field_range = VALUE #( BASE field_range ( sign = 'I' option = 'EQ' low = 'A1' ) ).
ENDIF.
IF p_check2 = abap_true.
  field_range = VALUE #( BASE field_range ( sign = 'I' option = 'EQ' low = 'A2' ) ).
ENDIF.
" ...

SELECT whatever FROM wherever WHERE field IN field_range.

注意:空范围表将匹配任何内容(“无限制”)并获取数据库表的全部内容,因此通常需要单独检查。

一种可能的方法:将选中的值附加到内部表,然后用于select语句中的所有项。

请尝试<代码>字段所在位置(var1、var2、var3等)。您仍然需要在中构建列表,但可能会更简单。新语法的使用很好+1最近是否引入了
BASE
关键字?我的系统出现语法错误。@Jagger Try
BASE field_range[]
-但除此之外,我认为新语法一直存在……我有一位同事,如果ranges表(I/EQ)中的条目超过某个数量,他会经历转储。这里还有其他人吗?@icbytes发生这种情况是因为生成的SQL超出了缓冲区,并且执行了剪切指令。这在过去发生在我身上。@vwegert
BASE
关键字已添加到7.40版的SP08中。更多信息。太糟糕了,我必须和SP06一起工作