2016-11-18 36 views
0

任务: 你能返回位于纽约的所有机器人吗?这个SQL(SUBSTR)代码为什么不正确?

enter image description here

我的代码:

SELECT * FROM robots 
WHERE SUBSTR(location, LEN(location)-2, 2) = 'NY'; 

一个工作代码:

SELECT * FROM robots 
WHERE SUBSTR(location, -2, 2) = 'NY'; 

LEN为什么不能很好地在我的代码工作?

感谢

+0

请详细说明“LEN工作不正常”。你有错误信息还是没有结果?你正在使用哪种SQL实现? –

+2

为什么不选择在哪里位置像'%NY'...不需要记录级计算 –

+0

@John Cappelletti - 如果任何位置有“Ny”它将提取错误记录,请注意图像中的第5条记录“Nyack, NY“ –

回答

1

的问题是,according to the documentation

开始

是一个整数或BIGINT表达式,它指定返回的字符开始。 (编号为1,表示表达式中的第一个字符为1)。

所以,SUBSTR("NY, NY", LEN("NY, NY")-2, 2)计算结果为SUBSTR("NY, NY", 4, 2),那就是:

NY, NY 
123456 
    ^^ 

你返回的字符串是" N",所以SUBSTR(location, LEN(location)-1, 2),减去1只,应该给你正确的结果。

0

试试这个。文字前后可能会有一些空间位置。所以在使用子串之前修剪文本。

--For MS SQL 
SELECT * FROM robots 
WHERE SUBSTRING(LTRIM(RTRIM(location)),LEN(LTRIM(RTRIM(location)))-1,LEN(LTRIM(RTRIM(location)))) = 'NY'; 

对于Oracle。我们必须使用length关键字而不是LEN。谢谢:-)

0

请注意,对SUBSTR的调用将停止查询选择/使用适当的索引。

SELECT * FROM robots 
WHERE SUBSTR(location, -2, 2) = 'NY'; 

在性能方面,你可以使用

LIKE '%, NY' 
在MS SQL

更好。