在 SELECT 语句中使用 CASE 作为条件语句,与一般条件判断使用的 CASE 类似,但有所区别
该语句不仅可以用于单值判断,也可以根据复杂条件进行判断;
此外,WHEN OTHERS 不再适用,需要使用 ELSE 代替,语句结束时使用 END,而不是 ENDCASE,且需要定义别名
SELECT CASE currcode
WHEN 'EUR' THEN carrname
ELSE url
END AS case_simple,
CASE
WHEN currcode = 'EUR' THEN url
WHEN carrname <> ' ' THEN carrname
ELSE carrid && '@' && currcode
END AS case_complex
FROM scarr
INTO TABLE @DATA(lt_data)
UP TO 5 ROWS.
使用条件语句判断并处理 NULL 值
在使用 LEFT / RIGHT OUTER JOIN 关联外表时,如果主表中存在记录,但在外表中没有关联到数据,则外表的这部分字段的值在取数过程中始终为 NULL,在取数完成后传入数据对象时,NULL 会再转换成系统兼容的值,通常为初始值;
NULL 值用于数值计算或是字符串处理时返回结果仍为NULL值,可以在条件语句中用 IS [ NOT ] NULL 判断以及处理
现在表缓存支持真null值了,null值不再被转换为类型初始值;
is initial,类型初始值;
DATA: lr_carrid TYPE RANGE OF s_carr_id.
lr_carrid = VALUE #( sign = 'I' option = 'EQ' ( low = 'AA' )
( low = 'CO' ) ).
SELECT DISTINCT
r~carrid,
CASE
WHEN t~seatsocc IS NULL THEN 'IS NULL'
WHEN t~seatsocc IS NOT NULL THEN 'IS NOT NULL'
END AS field_status
FROM scarr AS r
LEFT OUTER JOIN sflight AS t ON t~carrid = r~carrid
INTO TABLE @DATA(lt_data)
WHERE r~carrid IN @lr_carrid.
使用内嵌表达式 COALESCE( arg1, arg2, arg3 … argn )处理NULL值
该表达式用来返回第一个非 NULL 字段,参数至少有2个,至多255个,如果参数都为 NULL,则返回 NULL
DATA: lr_carrid TYPE RANGE OF s_carr_id.
lr_carrid = VALUE #( sign = 'I' option = 'EQ' ( low = 'AA' )
( low = 'CO' ) ).
SELECT r~carrid,
SUM( 1 ) AS total_lines,
SUM( t~seatsocc ) AS actual_occ,
SUM( t~seatsocc + 1 ) AS total_occ,
SUM( coalesce( t~seatsocc + 1 , 1 ) ) AS correct_occ
FROM scarr AS r
LEFT OUTER JOIN sflight AS t ON t~carrid = r~carrid
INTO TABLE @DATA(lt_data)
WHERE r~carrid IN @lr_carrid
GROUP BY r~carrid.
在查询语句中使用 CAST 实现字段的类型转换
以获取指定日期的汇率为例,汇率表中存储的日期不能直接使用,例如日期20180831 对应存储的数据为 79819168,所以我们在使用时需要转换类型
在程序中,我们可以调用 FM 来获取汇率,这里只用来测试 CAST 的使用,在CDS View中可能会被使用
DATA(lv_date) = CONV datum( '20180830' ).
SELECT MIN( CAST( CAST( @lv_date AS NUMC ) AS INT4 ) -
( 99999999 - CAST( CAST( gdatu AS NUMC ) AS INT4 ) ) ) AS time_differ,
ukurs AS exchange_rate
FROM tcurr
INTO TABLE @DATA(lt_data)
WHERE kurst = 'M'
AND fcurr = 'CNY'
AND tcurr = 'EUR'
GROUP BY gdatu, ukurs
HAVING MIN( CAST( CAST( @lv_date AS NUMC ) AS INT4 ) -
( 99999999 - CAST( CAST( gdatu AS NUMC ) AS INT4 ) ) ) >= 0
ORDER BY time_differ DESCENDING.
DATA(lv_exchange_rate) = VALUE #( lt_rate[ 1 ]-exchange_rate OPTIONAL ).
转换规则( ABAP 7.53 )如下图:
X:没有特殊限制
Y:初始长度不能小于目标长度
Z:目标长度必须足够显示源数据类型的值
C:初始长度必须等于目标长度
CDS生成OData,查询的内容包含日期,如果不用CAST转换,当日期为空时,就会报错,所以需要使用CAST转换,如下:
查询出来的结果:
上面的第一种有可能会报错,为空就会报错。
现支持 SELECT 传入 Parameter 从 CDS View 中获取数据
在查询语句中,参数必须紧接在对应的数据源后边,作为一个整体来使用,否则不能通过语法检查 测试用CDS
View如下图所示,该视图需要传入两个参数 ip_matnr 以及 ip_langu
SELECT *
FROM zcds_demo( ip_matnr = 'DHA_DEMO_1',
ip_langu = @sy-langu ) AS a
INTO TABLE @DATA(lt_data).