如何在动态where子句中执行列名? TO_NUMBER(列名)

时间:2013-02-26 21:54:05

标签: oracle11g

当用户必须输入各种标准进行搜索时,我正在尝试创建动态Select语句。

目前,除了最重要的部分外,我的声明的每一部分都有效。

我试图做这样的事情:

selStmt := 'SELECT column_one, column_2, column_3
            FROM nerf
whereClause := ' WHERE TO_NUMBER('''|| column_one ||''') <= '''|| userInput ||'''';

但是,在执行此操作时,我的SELECT语句的WHERE cluse不准确,如输出行所示:

WHERE TO_NUMBER('') <= '5';

我尝试了各种带引号的解决方案,最终我发现ORA-00905缺少标识符错误,或者我收到ORA-00911:无效字符错误。

此时我不太确定如何处理这个问题。

任何有用的帮助都会提前感谢。

2 个答案:

答案 0 :(得分:0)

这应该有效:

selStmt := 'SELECT column_one, column_2, column_3 FROM nerf';
whereClause := ' WHERE TO_NUMBER(column_one) <= TO_NUMBER('''|| userInput ||''')';

答案 1 :(得分:0)

出于某种原因,Oracle使用单引号来分隔字符串并转义字符,因此使用''是Oracle在字符串中添加引号的指令。例如:

'This is a string with a quote here: '' and then it ends normally'

将表示为

This is a string with a quote here: ' and then it ends normally

在您的示例中,您将结束正在构建的WHERE子句,然后连接名为column_one的PL / SQL变量标识符:

' WHERE TO_NUMBER('''|| column_one ||''')

...标识符NULL的{​​{1}}值表示为

column_one

大概你想从查询中引用 WHERE TO_NUMBER('') ,而不是从同名的PL / SQL变量引用,所以你应该删除它周围的引号:

column_one

在Oracle中转义字符串通常会让人感到愤怒 - 如果你有一个像GOAD或SQL * Developer那样具有良好语法高亮度的良好IDE,它会有很大的帮助。