Понимание поведения подстроки в postgresql

avatar
ziMtyth
8 апреля 2018 в 09:23
829
1
0

Я новичок в postgresql. Я пытался использовать функцию substring, пробуя некоторые примеры, я заметил "неудобное" поведение, которое я не понял. Рассмотрим следующие сценарии:

.

select substring('123456',1,3) возвращает 123 (что для меня логично)

select substring('123456',0,1) ничего не возвращает (не знаю почему!)

select substring('123456',-1,2) тоже ничего не возвращает!

Вопрос: Может кто-нибудь объяснить, как ведет себя функция подстроки postgresql, когда мы задаем ей 0 или отрицательные значения для позиции.

Источник
Jon Skeet
8 апреля 2018 в 09:29
0

Что возвращает select substring('123456', -1, 3) из интереса? Я подозреваю, что здесь важен тот факт, что индексы основаны на 1 ... может быть, предполагается, что что-то «до» позиции 1 просто не существует?

Kaushik Nayak
8 апреля 2018 в 09:47
0

Это определенно не работает как Oracle SUBSTR : см. обсуждение здесь postgresql.org/message-id/12803.1168804636%40sss.pgh.pa.us

Ответы (1)

avatar
404
8 апреля 2018 в 09:50
1

Первая позиция в строке — 1. Если вы выполните SUBSTR('abc', 1, 1), вы получите a. Если вы введете SUBSTR('abc', 0, 1), вы получите пустую строку, потому что в позиции 0 ничего нет. (SUBSTR не вызывает исключение, если позиция не существует.) То же самое для позиции -1 или 10.

Они оба возвращают a: SUBSTR('abc', 0, 2), SUBSTR('abc', -1, 3), что должно примерно показать, как SUBSTR работает в postgres. (Я использую SUBSTR, но это то же самое, что и SUBSTRING.)

Стоит также отметить, что массивы в postgres отсчитываются от 1, а не от 0.

ziMtyth
8 апреля 2018 в 10:46
0

в вашем примере SUBSTR('abc', 0, 1) вы говорите, что в позиции 0 ничего нет, я бы добавил кое-что, после моих тестов я могу сказать, что более уместно сказать there is nothing at position 0 with length 1, потому что если вы попробуете SUBSTR('abc', 0, 2), вы получите в результате, поэтому я думаю, что postgresql принимает 0 и отрицательные позиции, потому что длина определяет результат. было бы неплохо, если бы кто-то мог предоставить официальную документацию для моего объяснения (если это правильно), я искал и ничего не нашел.

404
8 апреля 2018 в 10:51
1

Да, я думал, что это само собой разумеется, учитывая, что аргумент длины, используемый в моем примере, равен 1, а длина 2 из 0 получает первый символ. Я не знаю о какой-либо документации для него, но, как я уже сказал, как это работает, довольно просто, если вы поиграетесь с несколькими пограничными случаями.

ziMtyth
8 апреля 2018 в 10:57
0

игра в некоторые тесты дала мне почти четкое представление о том, как это работает, я просто ищу официальную документацию, чтобы подтвердить свое понимание, потому что представьте, что мы передаем параметр этой функции из приложения, и какое-то значение может дать неожиданный результат только потому, что я не совсем понял, как работает эта функция, поэтому мне нужен официальный источник =)