【发布时间】:2020-03-05 14:41:25
【问题描述】:
我正在寻找替代变量是否可能是“动态的”。
例如,我想为可重复的脚本使用弹出窗口,提示用户输入两个变量:颜色和数字。但是,即使用户没有输入一个变量,我也需要脚本仍然运行。换句话说,如果留空,它会将变量设置为 IS NOT NULL。
这可能吗?
select user
from table
where colour = '&colour'
and number = &number
【问题讨论】:
我正在寻找替代变量是否可能是“动态的”。
例如,我想为可重复的脚本使用弹出窗口,提示用户输入两个变量:颜色和数字。但是,即使用户没有输入一个变量,我也需要脚本仍然运行。换句话说,如果留空,它会将变量设置为 IS NOT NULL。
这可能吗?
select user
from table
where colour = '&colour'
and number = &number
【问题讨论】:
这并不是 Oracle 真正打算做的事情(替换变量通常只是为了快速的临时事情,应该在前端处理严肃的报告)。
作为一个小技巧,你可以做这样的事情:
select user
from table
where (colour = '&&colour' OR '&&colour' IS NULL)
and (number = to_number('&&number') OR to_number('&&number') IS NULL);
顺便说一句,我有点惊讶地发现空字符串在 Oracle 中被视为NULL。
显然,'' IS NULL 的计算结果为真,'' = '' 的计算结果为假(这是有道理的,因为对 NULL 的任何相等性检查都是假的)
【讨论】:
&& instead of &,系统只会提示您输入变量一次。 (此外,文档有 a section about nulls 涵盖了您的最后两段 *8-)
& 的默认行为)
对于这类查询,我总是使用 nvl 函数;示例如下:
select user
from table
where colour = nvl('&colour', colour)
and number = nvl(&number,number)
;
【讨论】: