暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 其中变量!= varchar2列上的 “值” 表现得很奇怪

askTom 2017-04-27
297

问题描述

您能否向我解释一下我在dba_tables上获得不同输出的原因。

SQL> desc dba_tables
名称为空?类型
-
度VARCHAR2(40)

SQL> 从dba_tables中选择不同程度,其中程度!= 1;
从dba_tables中选择不同程度,其中程度!= 1
*
第1行的错误:
ORA-01722: 无效编号


SQL> 从dba_tables中选择不同程度,其中程度!= '1';

学位
----------------------------------------
1-显示输出,但也显示1-
3
默认
4
2

SQL> 从dba_tables中选择不同程度,其中程度!= '12 ';

学位
----------------------------------------
1
3
默认
4
2

这里还没有显示12。

SQL> 从dba_tables中选择 *,其中度 = 1;
从dba_tables中选择 *,其中度 = 1
*
第1行的错误:
ORA-01722: 无效编号


SQL> 从dba_tables中选择 *,其中degree = '1';

没有选择行

请让我们知道如何使用varchar2数据类型进行数据检索。

专家解答

SQL> desc dba_tables
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 OWNER                                                 NOT NULL VARCHAR2(128)
 TABLE_NAME                                            NOT NULL VARCHAR2(128)
 TABLESPACE_NAME                                                VARCHAR2(30)
 CLUSTER_NAME                                                   VARCHAR2(128)
 IOT_NAME                                                       VARCHAR2(128)
 STATUS                                                         VARCHAR2(8)
 PCT_FREE                                                       NUMBER
 PCT_USED                                                       NUMBER
 INI_TRANS                                                      NUMBER
 MAX_TRANS                                                      NUMBER
 INITIAL_EXTENT                                                 NUMBER
 NEXT_EXTENT                                                    NUMBER
 MIN_EXTENTS                                                    NUMBER
 MAX_EXTENTS                                                    NUMBER
 PCT_INCREASE                                                   NUMBER
 FREELISTS                                                      NUMBER
 FREELIST_GROUPS                                                NUMBER
 LOGGING                                                        VARCHAR2(3)
 BACKED_UP                                                      VARCHAR2(1)
 NUM_ROWS                                                       NUMBER
 BLOCKS                                                         NUMBER
 EMPTY_BLOCKS                                                   NUMBER
 AVG_SPACE                                                      NUMBER
 CHAIN_CNT                                                      NUMBER
 AVG_ROW_LEN                                                    NUMBER
 AVG_SPACE_FREELIST_BLOCKS                                      NUMBER
 NUM_FREELIST_BLOCKS                                            NUMBER
 DEGREE                                                         VARCHAR2(10)
...


您可以看到 “度” 是varchar2列。

所以当你这样做的时候:

其中度 = 1

我们有一个不匹配的数据类型,所以在内部我们做:

其中to_number (度) = 1

让它们对齐。当然,如果我们找到一个无法转换的度值,例如 “默认” 一词,那么我们将轰炸。

我们只需要处理任何领先的空间,

SQL> select count(*) from dba_tables where degree = '1';

  COUNT(*)
----------
         0

SQL> select count(*) from dba_tables where ltrim(degree) = '1';

  COUNT(*)
----------
      2735

SQL> select count(*) from dba_tables where degree = lpad('1',10);

  COUNT(*)
----------
      2735


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论