如何测试Oracle投影列表中Alien_Body_Part (NCLOB)的值?
我有一个包含三个 NCLOB 列的表。对于每个 NCLOB,我想要计算有多少不是“TC”或“NC”。 case when ... end 方法适用于 NVARCHAR2 列,但不适用于 NCLOB。如何测试投影列表中 NCLOB 的值?
Oracle Database 11g 版本 11.1.0.6.0
这个最小的示例演示了根本问题。
create table t (
alien_body_part nclob
);
insert into t(alien_body_part) values(null);
insert into t(alien_body_part) values('TC');
insert into t(alien_body_part) values('NC');
insert into t(alien_body_part) values('Extended Mandible');
select case when alien_body_part in ('TC', 'NC') then 0 else 1 end from t
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got NCLOB
I have a table with three NCLOB columns. For each NCLOB I want a count of how many are not 'TC' or 'NC'. The case when ... end approach works for NVARCHAR2 columns but not for NCLOB. How can I test the values of an NCLOB in the projection list?
Oracle Database 11g Release 11.1.0.6.0
This minimal example demonstrates the root issue.
create table t (
alien_body_part nclob
);
insert into t(alien_body_part) values(null);
insert into t(alien_body_part) values('TC');
insert into t(alien_body_part) values('NC');
insert into t(alien_body_part) values('Extended Mandible');
select case when alien_body_part in ('TC', 'NC') then 0 else 1 end from t
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got NCLOB
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
仅比较第一个字符:
在这种情况下,由于比较的一侧只有 2 个字符长,因此比较前 3 个字符就足够了(因为仅当 NCLOB 的长度为 2 个字符且这些字符长时,NCLOB 才等于“TC”)显然等于“TC”)。
此外,CASE 和 IN 都不是此处错误的原因(您不能直接比较 SQL 中的 CLOB/NCLOB),请考虑:
Only compare the first characters:
In this case since one side of the comparison is only 2 characters long, comparing the first 3 characters would be sufficient (as a NCLOB will be equal to 'TC' only if it is 2 characters long AND those characters equal 'TC' obviously).
Also neither the CASE nor the IN is the cause of the error here (you can't compare directly a CLOB/NCLOB in SQL), consider: