如何在SELECT语句中使用空格连接?

问题描述 投票:0回答:1

我正在尝试找到一种在 SQL 连接中保留空格的方法。

对于上下文:我从具有单个连接键列的表中选择一个表。连接键尊重空格。 示例:

BUKRS(4) = 'XYZ '
WERKS(4) = 'ABCD'
表示为键
XYZ ABCD

我试图在 SQL 中形成相同的值,但似乎 ABAP SQL 自动修剪所有尾随空格。

Select concat( rpad( tvko~bukrs, 4, (' ') ), t001w~werks ) as key, datab, datbi 
    from t001w 
       inner join tvko on tvko~vkorg  = t001w~vkorg
       left  join ztab on ztab~key = concat( rpad( tvko~bukrs, 4, (' ') ), t001w~werks ) "This is why I need the concat

    
    本例中的
  • rpad( tvko~bukrs, 4, ' ' )
    返回
    XYZ
    ,而不是
    XYZ 
    ,这导致连接值是
    XYZABCD
    ,而不是
    XYZ ABCD
  • lpad
    似乎工作得很好(返回
     XYZ
    ),这让我相信我做错了什么。
  • SQL 函数不接受字符串文字或变量(在 ABAP 中相同情况下保留空格),因为它们是非基本类型。

有什么方法可以填充/保留ABAP SQL中的空格(无需提取数据并在应用程序服务器中执行此操作)?

更新:我通过将键选择与数据选择分开并在ABAP AS中构建键解决了我的问题。这是一种避免问题而不是解决问题的解决方法,因此我将保持问题开放,以防出现实际的解决方案。

concatenation whitespace abap sql-function opensql
1个回答
2
投票

编辑:这篇文章没有回答插入多个字符的问题,这些字符根据某些表列中的值而变化,例如

LENGTH
功能在
RPAD( tvko~bukrs, LENGTH( ... ), (' ') )
中被禁止。仅从 ABAP 7.55 开始,您可以指示 SQL 表达式而不是固定数字。在此之前你不能在ABAP中做到这一点。可能的解决方法是混合 ABAP SQL 和 ABAP(例如 LIKE 'part1%part2',然后使用 ABAP 过滤掉)或直接使用本机 SQL(ADBC、AMDP 等)

关于 OpenSQL/ABAP SQL 中尾随空格的管理方式,它们似乎被忽略了,就像 ABAP 定长字符变量被忽略一样。

演示:我简化了您的示例以提取行

Walldorf plant

这些不起作用(没有返回行):

SELECT * FROM t001w
    WHERE concat( 'Walldorf ' , 'plant' ) = t001w~name1
    INTO TABLE @DATA(itab_1).

SELECT * FROM t001w
    WHERE concat( rpad( 'Walldorf', 1, ' ' ), 'plant' ) = t001w~name1
    INTO TABLE @DATA(itab_2).

这 2 个有效,一个带有前导空格,一个使用

concat_with_space
:

SELECT * FROM t001w
    WHERE concat( 'Walldorf',  ' plant' ) = t001w~name1
    INTO TABLE @DATA(itab_3).

SELECT * FROM t001w
    WHERE concat_with_space( 'Walldorf', 'plant', 1 ) = t001w~name1
    INTO TABLE @DATA(itab_4).

一般信息:ABAP 文档 - SQL 字符串函数

编辑:添加了工作示例,使用前导空格。

© www.soinside.com 2019 - 2024. All rights reserved.