0

我试图根据名称中字符串的长度显示前三行。但系统只读取字符串列的预定义长度而不是列中的字符串

SQL> select max(length(name)) from cus_detail;
MAX(LENGTH(NAME))
-----------------
               10
SQL> select * 
     from (select id, name, length(name) as namelen, distance 
           from cus_detail 
           order by length(name) desc
          )
     where rownum<=3;
        ID NAME          NAMELEN   DISTANCE
---------- ---------- ---------- ----------
         1 paul               10         15
         2 baul               10         15
         3 mereum             10         20
4

1 回答 1

1

这就是CHARdatatype 所做的 - 它用空格填充值直到整个列长度:

SQL> create table test (name char(10));

Table created.

SQL> insert into test (name) values ('London');

1 row created.

SQL> select max(length(name)) from test;

MAX(LENGTH(NAME))
-----------------
               10

SQL>

仔细看看:

SQL> select '#' || name ||'#' name, dump(name) dmp from test;

NAME         DMP
------------ --------------------------------------------------
#London    # Typ=96 Len=10: 76,111,110,100,111,110,32,32,32,32
       ^^^^                 L  o   n   d   o   n   ^^^^^^^^^^^
       spaces                                      spaces

所以,你可以trim的价值:

SQL> select max(length(trim(name))) from test;

MAX(LENGTH(TRIM(NAME)))
-----------------------
                      6

SQL>

或者 - 甚至更好 - 将列的数据类型更改为varchar2.

于 2019-07-31T06:02:41.723 回答