Я хочу найти первое и последние вхождения определенного символа в строке. Как пример, считайте строку названной "2010-####-3434" и предположите, что символ, который будет разыскиваться, является "#". Первое вхождение хеша в строке в 6-м положении, и последнее вхождение в 9-м положении.
Я не знаю, как это сделать, но функции регулярных выражений, такие как regexp_matches, regexp_replace, regexp_split_to_array, могут быть альтернативным путем к решению вашей проблемы
.Что ж ...
Select position('#' in '2010-####-3434');
даст вам первое. Если вы хотите последнее, просто запустите это снова с обратной стороной вашей строки. Обратную строку pl / pgsql можно найти здесь .
Select length('2010-####-3434') - position('#' in reverse_string('2010-####-3434')) + 1;
Эта чистая функция SQL предоставит последнюю позицию символа внутри строки, считая от 1. Она возвращает 0, если не найдена ... Но (большой отказ от ответственности) она прерывается, если символ является некоторым метасимволом регулярного выражения ( . $ ^ () [] * +
)
CREATE FUNCTION last_post(text,char) RETURNS integer AS $$
select length($1)- length(regexp_replace($1, '.*' || $2,''));
$$ LANGUAGE SQL IMMUTABLE;
test=# select last_post('hi#-#-#byte','#');
last_post
-----------
7
test=# select last_post('hi#-#-#byte','a');
last_post
-----------
0
Более надежное решение будет включать pl / pgSQL, как ответ rfusca.