如何测试Oracle投影列表中Alien_Body_Part (NCLOB)的值?

发布于 2024-11-02 07:55:30 字数 642 浏览 5 评论 0原文

我有一个包含三个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

输什么也不输骨气 2024-11-09 07:55:30

仅比较第一个字符:

SQL> SELECT dbms_lob.substr(alien_body_part, 4000, 1) body_part,
  2         CASE
  3            WHEN dbms_lob.substr(alien_body_part, 4000, 1)
  4                 IN ('TC', 'NC') THEN
  5             0
  6            ELSE
  7             1
  8         END is_nc_or_tc
  9    FROM t;

BODY_PART              IS_NC_OR_TC
---------------------- -----------
                                 1
TC                               0
NC                               0
Extended Mandible                1

在这种情况下,由于比较的一侧只有 2 个字符长,因此比较前 3 个字符就足够了(因为仅当 NCLOB 的长度为 2 个字符且这些字符长时,NCLOB 才等于“TC”)显然等于“TC”)。

此外,CASE 和 IN 都不是此处错误的原因(您不能直接比较 SQL 中的 CLOB/NCLOB),请考虑:

SQL> select * from t where alien_body_part = 'TC';

select * from t where alien_body_part = 'TC'

ORA-00932: inconsistent datatypes: expected - got NCLOB

Only compare the first characters:

SQL> SELECT dbms_lob.substr(alien_body_part, 4000, 1) body_part,
  2         CASE
  3            WHEN dbms_lob.substr(alien_body_part, 4000, 1)
  4                 IN ('TC', 'NC') THEN
  5             0
  6            ELSE
  7             1
  8         END is_nc_or_tc
  9    FROM t;

BODY_PART              IS_NC_OR_TC
---------------------- -----------
                                 1
TC                               0
NC                               0
Extended Mandible                1

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:

SQL> select * from t where alien_body_part = 'TC';

select * from t where alien_body_part = 'TC'

ORA-00932: inconsistent datatypes: expected - got NCLOB
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文