ABAP 新语法--Open SQL(草稿)

news2024/10/5 14:43:57

1. 常量

1.1 常量赋值

常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定

  SELECT
    mara~matnr, " 物料号
    mara~matkl, " 物料组
    mara~mtart, " 物料类型
    ' ' AS lkenz, " 删除标识,常量空字符串
    123 AS flag   " 常量数字
  FROM mara
  INTO TABLE @DATA(lt_mara)
  UP TO 100 ROWS.

  cl_demo_output=>display( lt_mara ).

像上面的删除标识字段就蛮有用的,循环内表有时候需要根据复杂的条件决定该行目是否需要,此时若不需要就打上删除标记’X’,最后再用 delete {table} where lkenz = ‘X’ 一次性删除

2. 宿主变量/表达式

2.1 作为SQL操作数

通常在查询语句中,程序声明(非数据库层级)的变量前需要使用转义符 @ 进行标识,这些宿主变量通常被用作 Open SQL 语句中的操作数
在查询语句内部声明结构/内表时,应该在 DATA 前使用转义符
此外,在使用宿主表达式(在 Open SQL 中作为操作数使用的一些表达式) 时,也需要添加转义字符,如下例所示

注:表达式内部的变量不需要再使用转义符,且不能使用表达式外部的数据库对象

  DATA: lv_maktx TYPE makt-maktx VALUE '物料描述'.

  SELECT
    mara~matnr, " 物料号
    mara~matkl, " 物料组
    mara~mtart, " 物料类型
    @lv_maktx AS maktx, " 物料描述    宿主变量
    @( COND char10( WHEN sy-langu = '1' THEN '中文'
                    WHEN sy-langu = 'E' THEN 'English'
                    ELSE                     '其他语言' ) ) AS langu    " 物料语言    宿主表达式
  FROM mara
  INTO TABLE @DATA(lt_mara)
  UP TO 100 ROWS.

  cl_demo_output=>display( lt_mara ).

3. 聚合表达式

3.1 对一组数据计算

聚合表达式用于对一组值执行计算并返回单一的值,可以使用在SELECT或HAVING子句中,不能用在WHERE子句
WHERE 子句的搜索条件在进行分组操作之前应用;而 HAVING 的搜索条件则在进行分组操作之后应用
常见的聚合表达式如下,表达式内部可选用DISTINCT对数据去重后再进行处理:

  • AVG:返回结果集的平均值,返回类型默认为浮点型,可通过AS语句返回指定类型,如DEC,CURR,QUAN或FLTP
  • MAX:返回结果集的最大值
  • MIN:返回结果集的最小值
  • SUM:返回结果集的汇总值
  • COUNT:返回结果集的条目数,通常情况下使用COUNT( * ) / COUNT(*),需要使用DISTINCT时则要指定字段名
  SELECT
    vbeln, 													 " 交货单号
    MAX( lfimg ) AS max_lfimg,                               " 最大交货数量
    MIN( lfimg ) AS min_lfimg,                               " 最小交货数量
    AVG( lfimg AS DEC( 14,3 ) ) AS avg_lfimg,                " 平均交货数量
    SUM( lfimg ) AS sum_lfimg,                               " 总交货数量
    COUNT(*)     AS count_lfimg,                             " 总行目数
    AVG( DISTINCT lfimg AS DEC( 14,3 ) ) AS avg_dstct_lfimg, " 去重交货数量
    SUM( DISTINCT lfimg ) AS sum_dstct_lfimg,                " 去重总交货数量
    COUNT( DISTINCT lfimg ) AS count_dstct_lfimg			 " 去重总行目数
  FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]
  WHERE
    vbeln BETWEEN '8000000061' AND '8000000069'
  GROUP BY vbeln
  INTO TABLE @DATA(lt_data).
  SORT lt_data BY vbeln.

4. 嵌入表达式

4.1 数值

在 SELECT LIST 使用内嵌表达式来处理数值,使用时需注意传入参数的类型
常见的数值表达式如下:

  • ABS:获取绝对值
  • CEIL:向上取整
  • FLOOR:向下取整
  • DIV:除法计算,取整数位
  • DIVISION:除法计算,保留 N 位小数
  • MOD:除法计算,取余数
  • ROUND:计算舍入值
  DATA(lv_num) = CONV lfimg( '-123.456' ).

  " 简化测试,全部用宿主变量
  SELECT SINGLE
    @lv_num               AS num          , " 原始值
    ABS( @lv_num )        AS abs_num      , " 绝对值
    CEIL( @lv_num )       AS ceil_num     , " 向上取整
    FLOOR( @lv_num )      AS floor_num    , " 向下取整
    DIV( 5 , 2 )          AS div_num      , " 除法,整数
    DIVISION( 5 , 2 , 2 ) AS divison_num  , " 除法,保留n位小数
    MOD( 5 , 2 )          AS mod_num      , " 取余
    ROUND( @lv_num , 2 )  AS rount_num_po , " 四舍五入,N为正数时,保留小数点后N位
    ROUND( @lv_num , -2 ) AS rount_num_ne   " 四舍五入,N为负数时,保留小数点前N位
  FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]
  INTO @DATA(ls_data).

在这里插入图片描述

4.2 字符串

在 SELECT LIST 使用内嵌表达式来处理字符串, 通常情况下字符串返回结果不能超过255个字符,如果字符长度异常,语法检查时会有错误提示

  • CONCAT:连接字符串,参数固定为2个,各个表达式之间可以嵌套使用,CONCAT内部也可以使用 &&
  • &&:连接字符串,参数没有个数限制,但不能将其他内嵌表达式当作参数使用,仅作为操作符使用,在非SELECT语句中也可以被使用
  • CONCAT_WITH_SPACE:连接字符串,并用 N 个空格分隔,该表达式结果不能超过1333个字符
  • INSTR:遍历字符串,查找指定字符 s1 并返回第一次出现的位置,没有查到则返回0
  • LEFT/RIGHT:从字符串左/右侧开始取出 N 位字符,忽略前导/尾部的空格
  • LENGTH:计算字符串长度
  SELECT concat( carrid , currcode )                AS concat       ,
         carrid && currcode                         AS concat_sign  ,
         concat_with_space( carrid , currcode , 1 ) AS with_space   ,
         instr( carrid , 'BA' )                     AS instr        ,
         left( carrname , 4 )                       AS left         ,
         right( carrname , 4 )                      AS right        ,
         length( carrname )                         AS length
  FROM scarr
  INTO TABLE @DATA(lt_data)
  UP TO 5 ROWS.
  • LOWER/UPPER:将字符串转换成小写/大写
  • LPAD/RPAD:在字符串左侧/右侧填充指定字符 s1,直到字符串长度为 N,如果初始值长度>=N,则不会填充,但是超过 N 位的字符会被截断
  • LTRIM/RTRIM:从字符串左侧/右侧开始逐个删除指定字符 s1,直到出现其他字符为止,默认会删除尾部的空格
  • REPLACE:将字符串中所有的指定字符 s1 用其他字符 s2 代替
  • SUBSTRING:从字符串第 N 位开始截取长度为 M 的字符,系统会默认检查截取范围是否超出该字段最大长度,以避免造成DUMP
SELECT lower( carrid ) AS lower,
       upper( carrid ) AS upper,
       lpad( carrid , 5 , 'B' ) AS lpad,
       rpad( carrid , 5 , 'B' ) AS rpad,
       ltrim( carrid , 'A' ) AS ltrim,
       rtrim( carrid , 'A' ) AS rtrim,
       replace( carrid , 'A' , '@' ) AS replace,
       substring( carrname , 5 , 10 ) AS substring 
  FROM scarr
  INTO TABLE @DATA(lt_data)
    UP TO 3 ROWS.     

4.3 日期/时间

在 SELECT LIST 使用内嵌表达式来处理日期/时间

  • DATS_IS_VALID/TIMS_IS_VALID:校验日期/时间有效性,有效时返回 1,否则返回 0(时间有效性的函数有报错,可能版本不支持)
  • DATS_DAYS_BETWEEN:计算日期d1和d2相隔的天数
  • DATS_ADD_DAYS:为指定日期加上N天
  • DATS_ADD_MONTHS:为指定日期加上N月
  DATA(lv_date) = CONV datum( '20181022' ).

  SELECT 
    fldate                                 AS original_date,
    dats_is_valid( fldate )                AS valid_date,
*    tims_is_valid( @sy-uzeit )             AS valid_time,
    dats_days_between( fldate , @lv_date ) AS between,
    dats_add_days( fldate , 10 )           AS add_days,
    dats_add_months( fldate , 3 )          AS add_months
  FROM sflight
  INTO TABLE @DATA(lt_data)
  UP TO 3 ROWS.

4.4 时间戳

在 SELECT LIST 使用内嵌表达式来处理时间戳

  • TSTMP_IS_VALID:校验时间戳有效性,有效时返回 1,否则返回 0
  • TSTMP_CURRENT_UTCTIMESTAMP:返回当前时间戳
  • TSTMP_SECONDS_BETWEEN:计算时间戳 t1 和 t2 相隔的秒数,需要用赋值语句进行传参,可以添加相应的错误处理
  • TSTMP_ADD_SECONDS:为指定时间戳加上 N 秒,N 必须为 timestamp 类型
DATA(lv_stamp_now) = CONV timestamp( '20190603133559' ).
DATA(lv_stamp_past) = CONV timestamp( '20190602161408' ).

SELECT tstmp_is_valid( @lv_stamp_now ) AS valid_stamp,
       tstmp_current_utctimestamp( ) AS current_stamp,
       tstmp_seconds_between( tstmp1 = @lv_stamp_past,
                              tstmp2 = @lv_stamp_now,
                              on_error = @sql_tstmp_seconds_between=>set_to_null ) AS between,
       tstmp_add_seconds( tstmp = @lv_stamp_now,
                          seconds = @( CONV timestamp( 999 ) ),
                          on_error = @sql_tstmp_add_seconds=>set_to_null ) AS add_second
  FROM sflight
  INTO TABLE @DATA(lt_data)
    UP TO 1 ROWS.

4.5 时区

ABAP_USER_TIMEZONE:获取用户时区,不传参时默认获取当前用户当前 Client 的时区
ABAP_SYSTEM_TIMEZONE:获取系统时区,不传参时默认获取当前 Client 的时区

SELECT abap_user_timezone( user = @( CONV uname( 'JIANGRE' ) ),
                           client = '130',
                           on_error = @sql_abap_user_timezone=>set_to_null ) AS user_zone,
       abap_system_timezone( client = '130',
                             on_error = @sql_abap_system_timezone=>set_to_null ) AS sys_zone
  FROM sflight
  INTO TABLE @DATA(lt_data)
    UP TO 1 ROWS. 

4.6 日期/时间转换

在 SELECT LIST 使用内嵌表达式来转换日期/时间/时间戳

  • TSTMP_TO_DATS:将时间戳转换成对应时区的日期
  • TSTMP_TO_TIMS:将时间戳转换成对应时区的时间
  • TSTMP_TO_DST:根据时间戳获取对应时区的夏令时标识
  • DATS_TIMS_TO_TSTMP:将日期和时间根据时区转换成时间戳
DATA(lv_stamp) = CONV timestamp( '20190603133559' ).

SELECT tstmp_to_dats( tstmp = @lv_stamp,
                      tzone = @( CONV tznzone( 'CET' ) ) ) AS dats,
       tstmp_to_tims( tstmp = @lv_stamp,
                      tzone = @( CONV tznzone( 'CET' ) ) ) AS tims,
       tstmp_to_dst( tstmp = @lv_stamp,
                     tzone = @( CONV tznzone( 'CET' ) ) ) AS dst,
       dats_tims_to_tstmp( date = @sy-datum,
                           time = @sy-uzeit,
                           tzone = @( CONV tznzone( 'CET' ) ) ) AS tstmp
  FROM sflight
  INTO TABLE @DATA(lt_data)
    UP TO 1 ROWS. 

5. Case

5.1 条件语句

在 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. 

6. NULL Value

在使用 LEFT / RIGHT OUTER JOIN 关联外表时,如果主表中存在记录,但在外表中没有关联到数据,则外表的这部分字段的值在取数过程中始终为 NULL,在取数完成后传入数据对象时,NULL 会再转换成系统兼容的值,通常为初始值;
NULL 值用于数值计算或是字符串处理时返回结果仍为NULL值,可以在条件语句中用 IS [ NOT ] NULL 判断以及处理

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. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QCon高分演讲:火山引擎容器技术在边缘计算场景下的应用实践与探索

近日&#xff0c;火山引擎边缘云原生团队的同学在QCon全球软件开发大会上分享了火山引擎容器技术在边缘计算场景下的应用实践与探索&#xff0c;并在一众AIGC、LLM等当下热门议题中脱颖而出&#xff0c;入选观众满意度投票中“叫好又叫座议题Top5”。 以下是演讲全文&#xff1…

论文阅读 Interpretable Unified Language Checking

本文提出了一种新的方法来解决多种自然语言处理任务中的问题&#xff0c;包括公平性检查、事实检查、虚假新闻检测和对抗攻击检测等。该方法基于大型语言模型和少量人类标注的提示信息&#xff0c;通过在模型中引入相应的提示&#xff0c;来提高模型的性能和可解释性。该论文的…

数据库索引及优化

索引 1.索引简介 1.1 概念 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。索引的本质&#xff1a;索引是数据结构。 注&#xff1a;在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&…

第二章---感知机

&#x1f31e;欢迎来到深度学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

centos各个版本jenkins部署

目录 官网安装方法 安装java&#xff0c;**注意java版本&#xff0c;新版本jenkins只支持jdk11及以上 安装jenkins Jenkins启动失败的七个问题 jenkins 部署脚本 Nginx转发jenkins服务 官网安装方法 Redhat Jenkins Packages (jenkins-ci.org)https://mirrors.jenkins-c…

微信朋友圈怎么定时发送?微信朋友圈定时发送有什么优势?

刷朋友圈已经成为大部分人日常中不可缺少的一件事&#xff0c;同时也是企业用来触达客户的重要渠道。下面一起来了解一下微信朋友圈定时发送的优势有哪些&#xff0c;还有怎么定时发朋友圈吧。 定时发朋友圈的优势有哪些&#xff1f; 1、让企业能够更好地管理自己的宣传信息 …

HttpRunner 接口自动化测试框架实战,打造高效测试流程

简介 2018年python开发者大会上&#xff0c;了解到HttpRuuner开源自动化测试框架&#xff0c;采用YAML/JSON格式管理用例&#xff0c;能录制和转换生成用例功能&#xff0c;充分做到用例与测试代码分离&#xff0c;相比excel维护测试场景数据更加简洁。在此&#xff0c;利用业…

Tree of Thoughts: Deliberate Problem Solving with Large Language Models

思维树&#xff1a;用大模型深思熟虑的解决问题 Tree of Thoughts: Deliberate Problem Solving with Large Language Models概述&#xff1a;核心思想&#xff1a;背景&#xff1a;IO promptingCoTCoT-SC 算法流程&#xff1a;主要实验对象&#xff1a;24点游戏创意写作填字游…

Linux5.3 Haproxy搭建Web群集

文章目录 计算机系统5G云计算第四章 LINUX Haproxy搭建Web群集一、Keepalived 概述1. HAProxy的主要特性2.常见的 Web 集群调度器3.HAProxy负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集 Keepalived部署高可用集群1.haproxy 服务器部署&#xff0c;配置负…

Linux shell脚本命令记录

1、cut cut 命令可以从一个文本文件或者文本流中提取文本列。 选项与参数&#xff1a; -d &#xff1a;后面接分隔字符。与 -f 一起使用&#xff1b; -f &#xff1a;依据 -d 的分隔字符将一段信息分割成为数段&#xff0c;用 -f 取出第几段的意思&#xff1b; -c &#x…

如何进行App性能测试?iTest工具助力你轻松实现!

目录 引言 功能简介 基本功能使用说明 其它功能 iTest数据上传功能 iTest使用注意事项 引言 如何使用iTest工具进行App性能测试。 在如今这个高度竞争的移动应用市场中&#xff0c;用户对于应用程序的体验需求越来越高&#xff0c;而良好的性能表现则是实现这一目标的关…

CleanMyMac X 4.13.4 Mac系统老牌清洁工具大测评-功能、优缺点盘点

CleanMyMac X 4.13.4 for Mac 是一款可靠且功能强大的Mac清洁工具工具&#xff0c;他可以让你随时检查Mac电脑的健康情况&#xff0c;并删除电脑中的垃圾文件&#xff0c;来腾出存储空间&#xff0c;保持Mac系统的整洁。至问世以来&#xff0c;CleanMyMac 系统倍受国内外用户推…

SpringBoot 源码分析刷新应用上下文(3)-refreshContext

一&#xff1a;入口 /*** Run the Spring application, creating and refreshing a new* {link ApplicationContext}.* param args the application arguments (usually passed from a Java main method)* return a running {link ApplicationContext}*/public ConfigurableAp…

高阶复杂网络重建:从时间序列中重建高阶网络

论文链接&#xff1a;https://www.nature.com/articles/s41467-022-30706-9 一、为什么要研究高阶网络&#xff1f; 复杂网络跟我们生活息息相关&#xff0c;例如社交网络的信息传播&#xff0c;疾病的感染扩散和基因调控网络的相互作用等。越来越多的研究突破了传统网络中两…

SSH暴力破解

Linux是开源系统&#xff0c;系统本身因漏洞造成的攻击相对比较少&#xff0c;主要集中在SSH攻击&#xff1b; SSH所采用的加密机制&#xff0c;可以防止数据传输过程中信息泄露&#xff1b; SSH基于用户名密码的身份验证&#xff0c;容易遭受密码暴力破解攻击&#xff1b; S…

上海交通大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 上海交通大学&#xff08;A&#xff09;考研难度&#xff08;☆☆☆☆☆&#xff09; 上海交通大学电子信息与电气工程学院的前身可溯源至1908年的电机专科&#xff0c;享有中国电气工程师“摇篮”的美称&#xff0c;…

远程线程注入之突破Session0隔离会话

前言 当我们使用远程线程注入将dll注入至系统服务进程中往往会失败&#xff0c;这是因为大多数系统服务都是在Session0中运行的 "Session 0"是Windows操作系统中的一个特殊的会话&#xff0c;专门用于运行系统服务和其他在用户登录之前就需要运行的程序。从Windows…

卷积神经网络CNN(第三次组会)

卷积神经网络 1. 为什么用卷积2. 两个原则3. 参数理解4. 理解卷积 1. 为什么用卷积 2. 两个原则 3. 参数理解 4. 理解卷积

Proteus仿真之IIC通信(AT24C02)

1.IIC通信简介&#xff1a;IIC是一种利用时钟线SCL和数据线SDA进行数据传输的通信协议。IIC的时序图如下所示&#xff1a; 我们需要看懂时序图中开始信号、数据传输、应答信号和停止信号。 开始信号&#xff1a;SCL为高电平时&#xff0c;SDA出现下降沿信号。 数据传输&#…

c++类和对象(封装)

4、类和对象 C面向对象的三大特性为&#xff1a;封装、继承、多态 C认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 例如: 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重...&#xff0c;行为有走、跑、跳、吃饭、唱歌...车也可以作为对象&#xff0c;属性…