Abap 按字符串类型的列选择

Abap 按字符串类型的列选择,abap,opensql,Abap,Opensql,我会尽可能简单地解释 我有一个数据库表“DB_JOURNAL”,它只有两列“Date”和“JOURNAL”类型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 '%footba

我会尽可能简单地解释

我有一个数据库表“DB_JOURNAL”,它只有两列“Date”和“JOURNAL”类型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条件下使用

有什么解决办法吗?

您确定“日记账”列的类型为字符串吗? 你能把它改成现有的数据元素吗

也考虑使用


将*从数据库日志选择到表lt\u日志的相应字段,其中日志类似于“%football”。

唯一的解决方案是使用数据库的SQL

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

最短但也是最旧的代码(SAP建议不要使用)与以下语句一起使用:

注意:上面的代码适用于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)
对于不区分大小写的搜索:

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)
其他方法是和


ADBC已经取代了
EXEC SQL

Sandra提出的避免原生SQL的唯一方法是使用循环选择:

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.

如果从查询中将
删除到表lt\u journal
中,会怎么样?``选择single*从DB\u journal到ls\u journal,其中的journal类似于''%football'。``也不起作用我不知道ABAP,但
Select*从表1到表2
将表1的内容复制到表2。这就是你真正想要的吗?事实上,选择更加复杂,并且有3个连接的表,我试图使示例尽可能简单possible@HUJGMB当然意味着
Select*from DB_JOURNAL,其中的JOURNAL如“%Football”
Yes,挑战在于“JOURNAL”列是字符串类型?程序不接受此
Select*from DB_JOURNAL进入表lt_JOURNAL的相应字段,其中的日志如“%football”
谢谢您的回答,我相信这适用于小表,但带有1M的表记录这将需要一段时间…是的,这取决于您的用例(您简化了实际场景)。如果仅通过单个字符串字段进行选择,则需要花费大量时间,原生SQL/AMDP/ADBC/CDS肯定会更好。非常感谢你!我不知道为什么编译器没有接受,因为我以前试过。但是使用这种语法,它可以工作!
EXEC SQL
/
ENDEXEC
块中的SQL(“本机SQL”)在语法上不同于没有这样一个块的SQL(ABAP SQL)。“本机SQL”由数据库直接解释和运行,而ABAP SQL首先由ABAP解释,它只允许非常有限的语法,并在运行时转换为数据库可以理解的SQL。注意:在
EXEC SQL
/
ENDEXEC
块中,不要输入经典的最后一个点。注意:以大写字母设置表名和列Letters@HUJ在小写字母中,它与HANA数据库配合良好。我还提到了你自己的经历。我在3个不同的系统上试用过:它在MSSQL和Oracle上工作,但在MaxDB上没有