关于交易的问题只是查询中的空值。
例如,我的下表包含以下字段和值
TABLEX
Column1
1
2
3
4
5
---------
Column2
null
A
B
C
null
我在特定程序上传递变量Y.程序里面是一个像这样的游标
CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY
现在问题是variableY可以是null,A,B或C. 如果variableY为null,我想选择column2为null的所有记录,否则column2为A,B或C。
我不能执行上面的游标/查询,因为如果variableY为null,它将无效,因为比较应该是
CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL
我应该使用哪种光标/查询来容纳null或字符串变量。
很抱歉,如果我的问题有点令人困惑。我解释事情并不是那么好。提前谢谢。
答案 0 :(得分:25)
根据该参数的内容生成不同的SQL,或者像这样更改SQL:
WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)
答案 1 :(得分:6)
where decode( col1, col2, 1, 0 ) = 0 -- finds differences
或
where decode( col1, col2, 1, 0 ) = 1 -- finds sameness - even if both NULL
答案 2 :(得分:2)
您可以使用以下内容:
SELECT * FROM TABLEX WHERE COALESCE(column2, '') = COALESCE(variableY, '')
(COALESCE采用第一个非NULL值)
请注意,这仅适用于列内容不能为''(空字符串)的情况。否则此语句将失败,因为NULL将匹配''(空字符串)。
(编辑) 你也可以考虑:
SELECT * FROM TABLEX WHERE COALESCE(column2, 'a string that never occurs') = COALESCE(variableY, 'a string that never occurs')
这将解决''失败假设。
答案 3 :(得分:2)
可能不合适取决于您正在查看的数据,但我见过(并使用过)的一个技巧是比较NVL(fieldname,somenonexistentvalue)。
例如,如果AGE是可选列,您可以使用:
if nvl(table1.AGE,-1) = nvl(table2.AGE,-1)
这取决于您知道的值永远不会被允许。年龄是一个很好的例子,薪水,序列号和其他数字,不能是负面的。字符串当然可能比较棘手 - 你可能会说你永远不会有任何名字叫'xyzzymaryhadalittlelamb'或者类似的东西,但是当你运用这个假设时,你知道他们会聘请一个有这个名字的人!!
所有这一切说:“其中a = b或(a为空,b为空)”是解决它的传统方法。这是不幸的,因为即使是有经验的程序员有时也会忘记它的一部分。
答案 4 :(得分:2)
下面类似于" top"回答但更简洁:
WHERE ((column2 = variableY ) or COALESCE( column2, variableY) IS NULL)
答案 5 :(得分:0)
尝试使用ISNULL()
功能。您可以检查变量是否为null,如果是,则设置默认返回值。将null归零可能无法实现。记住:null<>空
答案 6 :(得分:0)
WHERE variableY is null or column2 = variableY
for example:
create table t_abc (
id number(19) not null,
name varchar(20)
);
insert into t_abc(id, name) values (1, 'name');
insert into t_abc(id, name) values (2, null);
commit;
select * from t_abc where null is null or name = null;
--get all records
select * from t_abc where 'name' is null or name = 'name';
--get one record with name = 'name'
答案 7 :(得分:0)
您可以使用DUMP
:
SELECT *
FROM TABLEX
WHERE DUMP(column2) = DUMP(variableY);
<强> DBFiddle Demo 强>
警告:这不是SARG表达式,因此不会使用索引。
使用此方法,您无需搜索数据中不存在的值(例如NVL/COALESCE
)。