select语句中between和in的区别

本文探讨了ABAP中SELECT语句使用BETWEEN与IN的区别,特别是在处理空值时的不同行为。通过示例代码展示了如何正确使用这些关键字,并提供了解决方案。

出处:http://blog.youkuaiyun.com/donkey2004112103/archive/2009/05/03/4146114.aspx

 

abap中select语句里有几个需要注意的地方。如果要让选择的结果在某一个范围之内的话可以用betweenin 这两个关键字。大多数情况下二者的反映都是一样的,但是如果为空的情况就不一样了。如下:

WHERE vbeln BETWEEN pa_vb_s AND pa_vb_e.
      WHERE VBELN IN pa_vb.

他们的定义如下:

SELECT-OPTIONS pa_vb FOR vbrk-vbeln.

PARAMETERS: pa_vb_s TYPE vbeln,
                           pa_vb_e  TYPE VBELN.

如果他们都为空的话,between会限制select语句让它一条记录都无法选出来,但是in的话则相反,这个限制条件不会起任何作用,会选择出所有的记录。 这是二者最大的区别。

但是有一个小小的陷阱,ranges变量和select-options感觉上时相同的。但是在用select语句的时候表现会不同。代码如下:

PARAMETERS: pa_vb_s TYPE vbeln,
            pa_vb_e  TYPE VBELN.
       ranges pa_vb for VBRK-vbeln.
       pa_vb-sign = 'I'.
       pa_vb-option = 'BT'.
       PA_VB-LOW = PA_VB_S.
       PA_VB-HIGH = PA_VB_E.
       APPEND pa_vb.

此时如果用刚才的select语句用in去限制的话,也会一条都选不出来!这里起初不明白为什么会这样,跟踪程序发现就在append这句话。如果 用selct-options这句,在选择框里什么都不填的话,那么select-options这个ragnes变量里面是空值,就是内表记录数是0! 相当于没有append。但是我们自定义ragnes变量的时候会append空值,即使没有输入。这样就和between的功效一样了。要想和 selct-options的作用一样这样写就可以了。

IF PA_VB_S IS NOT INITIAL or PA_VB_E IS NOT INITIAL.
          APPEND pa_vb.
      ENDIF.

全部测试代码如下:

image

 

--------------------------------

 

所以,从IN RANGE里SELECT的时候,一定要先判断这个RANGE不为空,否则条件语句就失效了~!!!

### 查询高三学生的成绩 `SELECT` 语句SQL 中,使用 `BETWEEN AND` 操作符可以选取介于两个值之间的数据范围,这些值可以是数值、文本或者日期。该操作符通常用于 `WHERE` 子句中,以限定查询结果的范围。 #### 语法结构 选取介于两个值之间的数据: ```sql SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2; ``` 选取不在指定范围内的数据: ```sql SELECT column_name(s) FROM table_name WHERE column_name NOT BETWEEN value1 AND value2; ``` #### 示例:使用 `BETWEEN AND` 查询高三学生成绩 假设存在一个名为 `sc` 的成绩表,包含以下字段: - `sid`:学生编号 - `score`:成绩 同时,存在一个名为 `student` 的学生表,包含以下字段: - `sid`:学生编号 - `sname`:学生姓名 - `grade`:学生年级 ##### 示例 1:查询成绩在 60 到 80 分之间的高三学生 ```sql SELECT student.sid, student.sname, sc.score FROM student JOIN sc ON student.sid = sc.sid WHERE student.grade = '高三' AND sc.score BETWEEN 60 AND 80; ``` 此查询会返回所有高三学生中成绩在 60 到 80 分之间的记录[^1]。 ##### 示例 2:查询成绩不在 60 到 80 分之间的高三学生 ```sql SELECT student.sid, student.sname, sc.score FROM student JOIN sc ON student.sid = sc.sid WHERE student.grade = '高三' AND sc.score NOT BETWEEN 60 AND 80; ``` 此查询将返回所有高三学生中成绩低于 60 分或高于 80 分的记录[^1]。 ##### 示例 3:结合日期范围查询成绩记录 假设成绩表 `sc` 中还有一个 `exam_date` 字段表示考试日期,可以使用 `BETWEEN` 查询某个时间段内的考试成绩: ```sql SELECT student.sid, student.sname, sc.score, sc.exam_date FROM student JOIN sc ON student.sid = sc.sid WHERE student.grade = '高三' AND sc.exam_date BETWEEN '2023-01-01' AND '2023-12-31'; ``` 此查询将返回 2023 年全年高三学生的考试成绩记录[^1]。 ##### 示例 4:结合字符串范围查询学生姓名 `BETWEEN` 也可以用于字符串类型的字段,例如查询姓名在字母顺序上介于 "A" "M" 之间的学生: ```sql SELECT student.sid, student.sname FROM student WHERE student.sname BETWEEN 'A' AND 'M' AND student.grade = '高三'; ``` 此查询将返回所有高三学生中姓名以字母 A 到 M 开头的学生记录[^1]。 --- ### 注意事项 - `BETWEEN` 是包含边界值的,即包括 `value1` `value2`。 - `BETWEEN` 适用于数值、日期字符串类型的数据。 - 使用 `NOT BETWEEN` 可以筛选出不在指定范围内的数据。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值