Abap 按字符串类型的列选择
我会尽可能简单地解释 我有一个数据库表“DB_JOURNAL”,它只有两列“Date”和“JOURNAL”类型String 例如: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
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上没有