从 where 子句中筛选出空值



我有一个非常简单的选择:

select * from ZMM_TABLE
  into CORRESPONDING FIELDS OF table lt_table
  where mjahr = p_mjahr and
        werks = p_werks and

当p_values呈现时 - 一切都很好。有六个,所以问题 - 如何只使用那些由用户填充的。而且我不能强制要求填写所有这些字段。我想到了案例陈述,但组合可能太多了。我应该如何尽可能简单地解决这个问题?

首先:请注意,NULL值和空字段是两个完全不同的东西。 ABAP 应用程序中的NULL值相对不常见,需要使用 IS [NOT] NULL 语句进行处理。

假设你真的是指空字段,而不是NULL值:使用选择表,但使用规范的方式来定义它们,如果可能的话,使用现代方法来填充它们:

DATA: lt_range_whatever TYPE RANGE OF datatype_here.
lt_range_whatever = value #( ( sign = 'I' option = 'EQ' low = 'value' ) ).
SELECT foo, bar
  FROM baz
  INTO wherever
  WHERE whatever IN @lt_range_whatever.

抱歉,我找到了另一种方法来实现此目的。使用如下语句:

    select-OPTIONS: s_mjahr for ZMM_TABLE-mjahr no-EXTENSION
                    no INTERVALS,
...

 select * from ZMM_TABLE
  into CORRESPONDING FIELDS OF table lt_table
  where  mjahr in s_mjahr  and
         werks in s_werks and ... so on.

我假设您要过滤某些字段,如果过滤器为空,则该字段的任何值都是有效的。

最佳选择是根据需要生成查询。例如,如果用户输入"p_mjahr",而不是"p_werks",则发出创建类似...

select * from ZMM_TABLE
  into CORRESPONDING FIELDS OF table lt_table
  where mjahr = p_mjahr

如果无法做到这一点,您可以执行以下操作:

select * from ZMM_TABLE
  into CORRESPONDING FIELDS OF table lt_table
  where (mjahr = p_mjahr or p_mjahr = '') and
        (werks = p_werks or p_werks = '') and

此查询的工作方式是,如果p_mjahr有一个值,则"or"的第二个参数将为 false,但第一个参数将按预期匹配。但是,如果p_mjahr是''(空字符串),则or子句的第二个参数将被true,使整个子句true。通过and的进一步过滤器将按预期工作。

改用选择表的语法。为了使用它们,您必须像这样声明范围表:

DATA: BEGIN OF rtab OCCURS {10|n}, 
    sign   TYPE c LENGTH 1, 
    option TYPE c LENGTH 2, 
    low    LIKE dobj, 
    high   LIKE dobj, 
  END OF rtab.

它们要像这样填充:

rtab-sign = 'I'.
rtab-options = 'EQ'.
rtab-low = p_mjahr.
rtab-high = p_mjahr.
APPEND rtab.

如果选择表是初始的,则表达式 IN seltab 始终为 true。

p_values什么数据类型?

如果它们是 int 并且 mjahr 和 werks 不能具有值 0(零),则此示例将起作用:

select * from ZMM_TABLE
  into CORRESPONDING FIELDS OF table lt_table
  where mjahr = isnull(p_mjahr,0) and
        werks = isnull(p_werks,0) and

相关内容

  • 没有找到相关文章