【问题标题】:SELECT by column of type STRING按 STRING 类型的列选择
【发布时间】:2020-01-24 13:48:22
【问题描述】:

我会尽量简单地解释。

我有一个数据库表“DB_JOURNAL”,它只有 2 列“日期”和“日志”类型 String

例子:

01.01.2020 | I played football.

02.02.2020 | I played basketball

我想写一个Select语句并在查询中搜索字符串。 比如搜索足球这个词。

Select * from DB_JOURNAL into table lt_journal
       where journal like '%football%'.

这在 ABAP 中是不允许的:

“JOURNAL”字段为长字符串或文本,不能用于WHERE条件。

有什么解决办法吗?

【问题讨论】:

  • 如果从查询中删除into table lt_journal 会怎样?
  • ``` 将 DB_Journal 中的单个 * 选择到 ls_journal 中,其中的期刊类似于 '%football'。 ```也不行
  • 我不知道 ABAP 但Select * from table1 into table2 将 table1 的内容复制到 table2。这真的是你想要的吗?
  • 其实选择比较复杂,3个连接表,我尽量让例子简单
  • @HUJ GMB 当然是指Select * from DB_JOURNAL where journal like '%Football'

标签: abap opensql


【解决方案1】:

唯一的解决方案是使用native SQL,即数据库的SQL。

本机 SQL 可以以多种方式运行。

最短的代码也是最旧的代码(SAP 建议不要使用它)是 EXEC SQL 语句:

DATA text TYPE string.
EXEC SQL PERFORMING sr.
  SELECT text FROM sotr_textu INTO :text WHERE text LIKE '%e%'
ENDEXEC.
FORM sr.
  WRITE / text.
ENDFORM.

注意:上面的代码适用于 HANA、MSSQL 和 Oracle 数据库,但您需要使用 MaxDB 将表名和列名设置为大写。

更复杂的查询示例:

DATA: text   TYPE string,
      status TYPE string.

status = 'R'.

TRY.
    EXEC SQL PERFORMING sr.
      SELECT TEXT FROM SOTR_TEXTU INTO :text
           WHERE  STATUS  = :status
             AND  TEXT    LIKE '%e%'

    ENDEXEC.
  CATCH  cx_sy_native_sql_error INTO DATA(exc).
    cl_demo_output=>display( exc->get_text( ) ).
ENDTRY.
FORM sr.
  WRITE / text.
ENDFORM.

不区分大小写的搜索:

 AND  UPPER(TEXT) LIKE UPPER(:text)

其他方式有ADBCAMDP

ADBC 已取代 EXEC SQL

【讨论】:

  • 救命稻草。太感谢了!我不知道为什么编译器不接受我之前尝试过的。但是使用这种语法它可以工作!
  • EXEC SQL/ENDEXEC 块内的 SQL(“本机 SQL”)在语法上与没有此类块的 SQL(ABAP SQL)不同。 “Native SQL”由数据库直接解释和运行,而ABAP SQL首先由ABAP解释,只允许非常有限的语法,并在运行时转换成数据库可以理解的SQL。 注意:在 EXEC SQL/ENDEXEC 块内,不要输入经典的结尾点。
  • 注意:表名和列设置大写
  • @HUJ 小写,适用于HANA数据库。我已经添加了您自己的经历的提及。
  • 我在 3 个不同的系统上尝试过:它在 MSSQL 和 Oracle 上工作,但在 MaxDB 上不工作
【解决方案2】:

避免 Sandra 提出的 Native SQL 的唯一方法是使用循环 SELECT:

DATA: lt_journal TYPE TABLE OF db_journal WITH EMPTY KEY.

SELECT *
 FROM DB_JOURNAL
 INTO @DATA(wa).
 CHECK wa-journal CP '*football*'.
 APPEND wa TO lt_journal.
ENDSELECT.

【讨论】:

  • 感谢您的回答,我相信这适用于小表,但有 1M 记录的表需要一段时间...
  • 是的,这取决于您的用例(您简化了实际场景)。如果只选择单个字符串字段会花费很多时间,Native SQL/AMDP/ADBC/CDS肯定会更好
【解决方案3】:

您确定“Journal”列是字符串类型吗? 你能把它改成一些现有的数据元素CHAR40 什么的...

也可以考虑使用

Select * from DB_JOURNAL into CORRESPONDING FIELDS OF table lt_journal where journal like '%football'.

【讨论】:

  • 是的,挑战在于“Journal”列的类型是字符串吗?
  • 程序不接受这个Select * from DB_JOURNAL into CORRESPONDING FIELDS OF table lt_journal where journal like '%football'
猜你喜欢
  • 2019-07-13
  • 2018-02-21
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多