SQL长度目的

时间:2019-03-15 15:58:07

标签: sql oracle

我遇到了一个包含以下代码的查询,表中的城市是巴黎。

SQL >select INITCAP (cust_first_name | | ' ' | | 
UPPER (SUBSTR ( cust_city, 
-LENGTH(cust_city), 2))) 
FROM customers WHERE first_name = 'Abigail';

我的问题是关于length子句的,因为它前面似乎有一个负号,但是我不确定它的目的是什么。

有人可以帮我分解这个吗?

此查询的结果是:Abigail Pa

1 个答案:

答案 0 :(得分:1)

那是一种很奇怪的做事方式!

SUBSTR的开始位置参数中使用负数表示从字符串末尾开始计数。

因此,在您的查询中,对于长度为N的cust_city,SUBSTR从字符串末尾的第N个字符开始。

这实际上意味着SUBSTR从字符串开头的第一个字符开始,这意味着您的查询可以被重写:

select initcap(cust_first_name||' '||upper(substr(cust_city, 1, 2)))
from   customers
where  first_name = 'Abigail';

此外,UPPER是多余的;当附加在字符串上的字符串在整个字符串上移到INITCAP时,强制cust_city的前两个字符大写的意义是什么?

因此,我将按照以下方式编写您的查询:

select initcap(cust_first_name||' '||substr(cust_city, 1, 2))
from   customers
where  first_name = 'Abigail';

更简单,更容易理解恕我直言!