11

我想在字符串中查找特定字符的第一次和最后一次出现。例如,考虑一个名为“2010-####-3434”的字符串,并假设要搜索的字符是“#”。字符串中第一次出现的散列在第 6 位,最后一次出现在第 9 位。

4

7 回答 7

30

好...

Select position('#' in '2010-####-3434');

会给你第一个。如果你想要最后一个,只需用你的字符串的反面再次运行它。可以在此处找到 pl/pgsql 字符串反转。

Select length('2010-####-3434') - position('#' in reverse_string('2010-####-3434')) + 1;
于 2010-06-03T13:27:26.870 回答
5

在 的情况下char = '.',需要逃生。所以函数可以写成:

CREATE OR REPLACE FUNCTION last_post(text,char) 
RETURNS integer LANGUAGE SQL AS $$  
select length($1)- length(regexp_replace($1, E'.*\\' || $2,''));  
$$;
于 2011-05-10T19:29:19.903 回答
5

我的例子:

reverse(substr(reverse(newvalue),0,strpos(reverse(newvalue),',')))
  1. 反转所有字符串
  2. 子串字符串
  3. 反转结果
于 2018-10-15T07:37:42.140 回答
4

9.5+ 与array_positions

使用我们调用的基本PostgreSQL 数组函数string_to_array(),然后将其提供给array_positions()like thisarray_positions(string_to_array(str,null), c)

SELECT
  arrpos[array_lower(arrpos,1)] AS first,
  arrpos[array_upper(arrpos,1)] AS last
FROM ( VALUES
  ('2010-####-3434', '#')
) AS t(str,c)
CROSS JOIN LATERAL array_positions(string_to_array(str,null), c)
  AS arrpos;
于 2017-03-10T07:43:52.153 回答
3

我不知道该怎么做,但正则表达式函数如regexp_matches, regexp_replace,regexp_split_to_array可能是解决您的问题的替代途径。

于 2010-06-03T12:51:32.287 回答
3

这个纯 SQL 函数将提供字符串中 char 的最后位置,从 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

作为 rfusca 的回答,一个更强大的解决方案将涉及 pl/pgSQL。

于 2010-06-03T14:46:19.367 回答
0

计算最后一个位置的另一种方法是通过分隔符将字符串拆分为数组,等于所需的字符,然后从整个字符串的长度中减去最后一个元素的字符长度

CREATE FUNCTION last_pos(char, text) RETURNS INTEGER AS
$$
select length($2) - length(a.arr[array_length(a.arr,1)]) 
from (select string_to_array($2, $1) as arr) as a
$$ LANGUAGE SQL;

对于第一个位置,它更容易使用

select position('#' in '2010-####-3434');
于 2016-09-02T12:32:19.157 回答