我有个小问题。我有一张table,上面有下面的描述。
SQL> desc ERROR
Name Null? Type
----------------------------------------- -------- ----------------------------
DPDATE_TIME NOT NULL DATE
ERR_MSG NOT NULL VARCHAR2(132)
CODE1 VARCHAR2(50)
现在,当我选择下面给出的代码1时,上面的表
SELECT substr(code1, 1,length(code1)) as name From ERROR where code1='xxxxAXP'
NAME
--------------------------------------------------
xxxxAXP
xxxxAXP
它选择该列的长度,然后显示它。我的意思是,它不是只显示7个字符,而是显示50个带有空格的字符。
但如果我这么做了
SELECT substr(code1, 1,7) as name From ERROR where code1='xxxxAXP'
NAME
-------
xxxxAXP
xxxxAXP
那就完美了。我不能使用下面的查询,因为每个代码的长度可能不同,硬编码为7是不好的。有没有通用的方法来实现这一点?谢谢您。
3条答案
按热度按时间zphenhs41#
在sql*plus中显示的列长度为50个字符。
但是,列的长度真的是这样吗?这将导致您声称的错误:
结果是什么
因为,如果sql*plus困扰您,请使用
斯科特模式演示:
mgdq6dx12#
简单的逻辑为什么sqlplus在
length()
和7的大小,如果是常数7英寸substr
:sqlplus不知道在
length()
所以它显示了50个字符,空格等于列的实际大小。如果是7英寸
substr
,它知道每个结果的长度为7个字符或更小,因此它只显示7个字符的大小。u0sqgete3#
sqlplus分析游标的列定义,游标是在解析时生成的,而不是在运行时生成的。所以它不知道你真的只有7个字符。sqlcl还分析输出,因此请改用sqlcl。
oracle返回列定义,而不是sql*plus: