2016-08-15 5 views
1

Когда имеет смысл позвонить SUBSTRING с нулевым или отрицательным индексом, учитывая тот же результат, который может быть достигнут с индексом 1. Эти запросы дают идентичные результаты. Они урезают самого правого персонажа. Но почему TSQL даже дает результат для 3-го, 4-го и 5-го запросов.Когда использовать отрицательный индекс для подстроки

SELECT LEFT('ab,', LEN('ab,') - 1)    -- makes sense 

SELECT SUBSTRING('ab,', 1, LEN('ab,') - 1)  -- makes sense 

SELECT SUBSTRING('ab,', 0, LEN('ab,'))   -- why? 

SELECT SUBSTRING('ab,', -1, LEN('ab,') + 1)  -- why? 

SELECT SUBSTRING('ab,', -2, LEN('ab,') + 2)  -- why? 

Результаты:

---- 
ab 


---- 
ab 


---- 
ab 


---- 
ab 


---- 
ab 

ответ

2

From Substring Documentation:

Синтаксис для подстроки:

SUBSTRING (expression ,start , length) 

старт

Является выражением integer или bigint, которое указывает, где начинаются возвращенные символы. Если значение начала меньше 1, возвращаемое выражение будет начинаться с первого символа, указанного в выражении. В этом случае количество возвращаемых символов является наибольшим значением либо суммы начала + длины-1, либо 0. Если начало больше числа символов в выражении значения, возвращается выражение с нулевой длиной.

длина

является положительным целым числом или BIGINT выражение, которое определяет, как будут возвращены многие символы выражения. Если длина отрицательная, генерируется ошибка и оператор завершается. Если сумма начала и длины больше, чем число символов в выражении, значение выражения в целом, начиная с начала возвращается

Теперь приходя на ваш вопрос ..

SELECT SUBSTRING('ab,', 0, LEN('ab,'))   -- why? 
---start at zero and get values till whatever count of `LEN('ab,')` this returns 

SELECT SUBSTRING('ab,', -1, LEN('ab,') + 1)  -- why? 
--We know if start is negative,substring starts at 0 from above documentation 


SELECT SUBSTRING('ab,', -2, LEN('ab,') + 2)  -- why? 
--We know if start is negative,substring starts at 0 from above documentation 

когда использовать отрицательный Substring:
Как вы можете видеть, это не имеет значения, когда вы используете отрицательное начало или ноль, SQL всегда будет начинаться с 0 в обоих случаях ..

Есть нет случаев использования, я могу думать, когда поведение specnying отрицательной длины полезно.

это может быть добавлено в документацию, так как несколько раз, когда мы хотим добавить длину начала динамически и указать что-то вроде ниже. .

CHARINDEX('somesearchitem', 'Expression, 5)-10 

выше выражение несколько раз приведет к отрицательным значениям, в этом случае SQL начнет запуск выражения в отличие от выбрасывания ошибки, как в случае длины

+0

Да документировано поведение. Но полезно ли это поведение? Имеет ли смысл использовать его? –

+0

@ AnthonyFaull: я не вижу никаких вариантов использования, так как оба они одинаковы – TheGameiswar

+0

Согласен. Спасибо за Ваш ответ. –

Смежные вопросы