首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在HANA SQL语句的占位符子句中转义单引号

问在HANA SQL语句的占位符子句中转义单引号
EN

Stack Overflow用户
提问于 2018-12-18 03:33:01
回答 1查看 4.2K关注 0票数 0

我注意到"HANA“在占位符子句上下文中转义单引号的方式不一致。例如,考虑以下占位符子句片段:

('PLACEHOLDER' = ('$$CC_PARAM$$','''foo'',''an escaped single quote \'' '''))

上面的占位符子句包含分配给CC_PARAM的多个值。参数。我们可以看到,在第二个参数中,我们有一个用反斜杠转义的单引号。但是,我们用另一个单引号(即我们使用''而不是\'' )来规避每个参数之外的单引号。对于第一种情况,可以使用\''格式,但在第二种情况下,不可能使用''格式。

为什么会有这种差异?它使转义引号在多输入输入参数中很棘手。我希望以编程的方式为HANA编写SQL查询。我是不是漏掉了什么?在所有情况下,在\''之上使用''是否安全?还是我需要逻辑来判断单引号在哪里发生,并在适当的情况下转义?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 05:08:45

这里的隐含规则是,对于计算视图的参数值,反斜杠\用于转义单引号。

对于所有出现的标准SQL字符串,使用两次单引号''是区分语法元素和字符串文字的正确方法。

至于原因:

  • PLACEHOLDER语法不是SQL,而是特定于HANA的命令扩展。因此,不存在当前实现违反的通用标准。
  • 给定的情况下,这个命令扩展将分别嵌入到标准SQL语法中,并且必须由同一个解析器处理。

但是,参数不仅由SQL解析器解析一次,而且由基于计算视图实例化计算场景的组件再次解析。稍微斜视一下,不难看出参数接口是一个通用的键值接口,它允许将各种信息传递给calc。引擎。

人们可能会认为,通过键值对提供参数的整个方法不符合一般的SQL语法方法,而且是正确的。另一方面,这种方法允许向HANA特定部分添加新的命令元素,而不需要从结构上改变语法(以及与其一起使用解析器)。这明显的缺点是,键名和值都是字符串类型的。为了避免丢失“内部字符串”所需的转义,需要使用与主SQL转义字符串不同的转义字符串。

在这里,我们使用了两种不同的方法来传递字符串值,作为筛选条件。

有趣的是,这两种方法仍然可能导致相同的查询执行计划。

事实上,在许多具有输入参数的场景中,字符串值将在内部转换为符合SQL的表单。当输入参数用于筛选或在calc中的表达式中使用时,情况就是如此。可以转换为SQL表达式的视图。

例如

代码语言:javascript
复制
 SELECT
     "AAA" 
FROM "_SYS_BIC"."sp/ESC"
     ('PLACEHOLDER' = ('$$IP_TEST$$',  'this is a test\''s test'));

在我的系统上显示以下执行计划

代码语言:javascript
复制
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语法时可以考虑这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53826008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档