我注意到在PLACEHOLDER子句的上下文中,“ HANA SQL”如何转义单引号不一致。例如,考虑以下PLACEHOLDER子句片段:
('PLACEHOLDER' = ('$$CC_PARAM$$','''foo'',''an escaped single quote \'' '''))
上面的PLACEHOLDER子句包含分配给CC_PARAM的多个值。参数。我们可以看到第二个参数的 inside 中有一个单引号,并用反斜杠转义。但是,我们将每个参数的单引号外面用另一个单引号引起来(即,我们用''
代替了\''
。可以将\''
格式用于第一种情况,但在第二种情况下无法使用''
格式。
为什么会有这种差异?它使多输入输入参数中的转义引号变得棘手。我正在寻找以编程方式为HANA设计SQL查询。我在这里想念什么吗?在所有情况下,在\''
上使用''
是否安全?还是我需要逻辑来判断单引号在哪里出现并适当地转义?
答案 0 :(得分:1)
此处隐含的规则(由软件的实现方式决定)是对于计算视图的参数值,反斜杠\
用于转义单引号。
对于所有标准SQL字符串出现,两次使用单引号''
是区分语法元素和字符串文字的正确方法。
原因:
PLACEHOLDER
语法不是SQL,而是HANA特定的命令扩展名。因此,当前的实现没有违反任何通用标准。
,此命令扩展被嵌入,并分别钳制到标准SQL语法中,并且必须由同一解析器处理。
但是参数不仅由SQL解析器解析一次,而且由基于计算视图实例化计算方案的组件再次解析。稍作斜视,不难看出参数接口是一个通用的键值接口,该接口允许将各种信息传递给计算。引擎。
有人可能会争辩说,通过键值对提供参数的整个方法与常规SQL语法方法不一致,并且是正确的。另一方面,这种方法允许在不对语法(以及语法分析器)进行结构更改的情况下,为向HANA特定部分添加新命令元素提供一般灵活性。 显而易见的缺点是键名和值都是字符串类型的。为了避免丢失所需的“内部字符串”转义,需要使用与主SQL转义字符串不同的转义字符串。
在这里,我们有两种不同的方式来处理字符串值以用作过滤条件。
很有趣,两种方法仍可能导致相同的查询执行计划。
事实上,在许多带有输入参数的方案中,字符串值将在内部转换为符合SQL的形式。当输入参数用于过滤或calc中的表达式时,就是这种情况。可以转换为SQL表达式的视图。
例如
SELECT
"AAA"
FROM "_SYS_BIC"."sp/ESC"
('PLACEHOLDER' = ('$$IP_TEST$$', 'this is a test\''s test'));
在我的系统上显示以下执行计划
OPERATOR_NAME OPERATOR_DETAILS
PROJECT TEST.AAA
COLUMN TABLE FILTER CONDITION: TEST.AAA = 'this is a test's test'
(DETAIL: ([SCAN] TEST.AAA = 'this is a test's test'))
请注意如何删除转义符\'
。
总而言之:使用PLACEHOLDER
值时,需要使用\'
的转义,而在所有其他情况下,则需要使用''
的转义。
对于查询构建器而言,这应该不是很难实现的,因为您在处理PLACEHOLDER
语法时可以考虑到这一点。