[有人可以向我解释一下,在SAP HANA查询中使用PLACEHOLDER
和WHERE
之间的区别。我是SAP HANA的新手,在springboot应用程序中,我必须使用一个PLACEHOLDER查询来从计算视图中获取一些数据。问题是,当将spring数据jpa与SAP HANA一起使用时,由于某种原因,PLACEHOLDER查询无法在查询创建期间动态替换值。例如查询:
select * from SOME_TABLE ('PLACEHOLDER' = ('$$IP_SOME_COLUMN1$$', 'value1') ,('$$IP_SOME_COLUMN2$$', 'value2'));
[每当我们尝试将值动态传递给此查询时,由于某种原因,查询创建都会失败。因此,我们希望改用大家都熟悉的WHERE
子句,但需要澄清它们之间的区别以及它可能如何影响性能。
与HANA中的WHERE
子句占位符不同,它是非标准/专有语法扩展名。这个想法是查询可以向视图提供其他信息-通常是过滤条件,否则将无法在处理过程中“下推”。
这些概念在它们的用例中重叠,但是在实现和意义上完全不同。
关于“动态传递值”问题:旧的占位符语法不支持SQL查询参数/主机变量替换(查询文本中的?)。为此,您需要使用参数语法的新变体。
[APPLY_FILTER函数将应用SQL谓词,就像将其添加到where子句一样。在下面的示例中,变量sql_filter包含一个我们希望在不使用动态SQL的情况下应用的复杂过滤谓词。这是在星期五创建的所有视图的列表:
do begin
declare sql_filter nvarchar(200) = 'weekday(create_time)=4';
tv= select dayname(create_time) as create_day, schema_name, view_name
from VIEWS;
res=APPLY_FILTER(:tv, :sql_filter);
select * from :res;
end;
这种带有do begin和table变量的构造从客户端应用程序调用起来并不容易,因此我建议您改写一个table函数:
create or replace function DYN_FILTER_VIEWS(
IN SQL_FILTER NVARCHAR(1000)
) RETURNS TABLE (
create_day nvarchar(20),
schema_name nvarchar(255),
view_name nvarchar(255)
)as
begin
tv= select dayname(create_time) as create_day, schema_name, view_name
from VIEWS;
res=APPLY_FILTER(:tv, :SQL_FILTER);
return select * from :res;
end;
从应用程序中,您可以通过将参数传递给准备好的语句来简单安全地调用它:
select * from DYN_FILTER_VIEWS('view_name like ''%ELT%'' ')