Oracle列别名中的双引号

时间:2020-03-05 18:51:27  来源:igfitidea点击:

好的,这是一个晦涩的问题,但是希望有人可以帮助我解决这个问题。

我正在使用的系统将构建一个动态SQL字符串,以便在存储过程中执行该动态SQL字符串,并且该动态SQL的一部分将定义列别名,这些别名本身实际上是从用户生成的数据的另一个表中检索的值。

因此,例如,字符串可能看起来像;

SELECT table1.Col1 AS "This is an alias" FROM table1

这很好。但是,用于别名的值可能包含双引号字符,这会打乱外引号。我以为我可以以某种方式在别名内转义双引号,但是我没有运气弄清楚如何做到这一点。反斜杠不起作用,并且连续使用两个双引号会导致此错误。

SQL Error: ORA-03001: unimplemented feature
03001. 00000 -  "unimplemented feature"
*Cause:    This feature is not implemented.

以前有没有人对此问题有经验?
为任何有见识的人欢呼。

p.s.别名周围需要使用引号,因为它们可以包含空格。

解决方案

回答

当我运行这个:

select 'test"columnname"' from dual

Oracle返回此信息(注意Oracle生成的列名):

'TESTCOLUMNNAME'
--------------------------------
test"columnname

Oracle的列名不包含我的双引号这一事实告诉我,Oracle可能无法代表这一点。

据我所知,最好的选择是在使用列名之前从数据中删除双引号。可悲的是,这也将要求我们在选择这些列时进行相同的过滤,但是我看不到其他方法。

回答

我们可以在代码中放一个字符而不是双引号并将其替换为双引号吗?

像这样的东西:

SELECT table1.Col1 AS "This is |not| an alias" FROM table1

然后只需替换|和 "。

我知道这是一个hack,但是我想不出更好的解决方案了……无论如何,我们在做什么。 "好的"方法是分别选择值和列名,并将它们与代码关联。那将使事情变得更加清洁。

回答

一个可能富有成效的研究领域将是研究报价方法。

我的$ quotedString = $ dbh-> quote($ string);

回答

使用Oracle引用运算符:

select q'#someone's quote#' from dual;

可以用任何字符替换"#"