Нечетная ошибка в функции SQL TRIM () - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть следующая таблица:

select * from top3art;

            path             | count
-----------------------------+--------
 /article/candidate-is-jerk  | 338647
 /article/bears-love-berries | 253801
 /article/bad-things-gone    | 170098

Я хочу обрезать '/ article /' в значениях пути, поэтому я делаю это:

select *, trim(leading '/article/' from path) from top3art;

            path             | count  |       ltrim
-----------------------------+--------+--------------------
 /article/candidate-is-jerk  | 338647 | ndidate-is-jerk
 /article/bears-love-berries | 253801 | bears-love-berries
 /article/bad-things-gone    | 170098 | bad-things-gone

Ряды 2 и 3 работают просто отлично. Но что случилось с 1-м рядом ?? Это урезано '/ статья / CA'. Почему понадобилось еще 2 символа?

Теперь посмотрим, что произойдет, когда я просто урежу '/ articl':

select *, trim(leading '/articl' from path) as test from top3art;

            path             | count  |         test
-----------------------------+--------+----------------------
 /article/candidate-is-jerk  | 338647 | e/candidate-is-jerk
 /article/bears-love-berries | 253801 | e/bears-love-berries
 /article/bad-things-gone    | 170098 | e/bad-things-gone

Это работает, как и ожидалось ... Теперь посмотрим, что произойдет, когда я добавлю еще один символ в мое предложение обрезки, '/ article':

select *, trim(leading '/article' from path) as test from top3art;

            path             | count  |        test
-----------------------------+--------+--------------------
/article/candidate-is-jerk  | 338647 | ndidate-is-jerk
/article/bears-love-berries | 253801 | bears-love-berries
/article/bad-things-gone    | 170098 | bad-things-gone

То же, что и первый результат! Я не могу понять это. Почему это происходит? Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

trim удаляет любой символ в первом аргументе из второго аргумента, поэтому он также удаляет c и a слова-кандидата. Вместо trim вы можете использовать split_part вызов:

select *, split_part(path, '/article/', 2) as test from top3art;
0 голосов
/ 03 ноября 2018

Обрезка удаляет все упомянутые вами знаки, а не слова / фразы. Вместо обрезки используйте replace ()

select *, replace(path, '/article/','') from top3art;
...