从where子句中过滤掉空值

时间:2016-02-05 06:48:40

标签: sql abap

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

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

...

当出现p_values时 - 一切正常。它有六个,所以问题 - 如何只使用那些由用户填充的问题。而且我不能强制要求并且要求填补所有这些领域。 我考虑了案例陈述,但可能有太多的组合。我应该如何尽可能简单地解决这个问题?

5 个答案:

答案 0 :(得分:1)

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

最好的选择是根据需要构建查询。例如,如果用户输入“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的其他过滤器将按预期工作。

答案 1 :(得分:1)

首先:请注意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.

答案 2 :(得分:1)

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

    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.

答案 3 :(得分:-1)

请改用selection tables' syntax。要使用它们,您必须声明范围表,如下所示:

public class BaseCar : IEquatable<ICar>, IComparable<ICar>
{
    /// [...]
}

public void Test(BaseCar car1, BaseCar car2)
{
    car1.Equals(car2);
    car2.CompareTo(car2);
}

他们将被这样填充:

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. 始终为真。

答案 4 :(得分:-2)

什么数据类型是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