如何在PostgreSQL中查找字符串中特定字符的第一次和最后一次出现

时间:2010-06-03 11:56:15

标签: postgresql plpgsql

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

7 个答案:

答案 0 :(得分:15)

嗯...

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

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

Select length('2010-####-3434') - position('#' in reverse_string('2010-####-3434')) + 1;

答案 1 :(得分:5)

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

CREATE OR REPLACE FUNCTION last_post(text,char) 
RETURNS integer LANGUAGE SQL AS $$  
select length($1)- length(regexp_replace($1, E'.*\\' || $2,''));  
$$;

答案 2 :(得分:3)

带有array_positions

9.5+

使用基本的PostgreSQL array functions,我们会调用string_to_array(),然后将其反馈给array_positions() array_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;

答案 3 :(得分:2)

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

答案 4 :(得分:2)

这个纯SQL函数将提供字符串中char的最后位置,从1开始计数。如果找不到则返回0 ...但是(大免责声明)如果字符是某个正则表达式元字符,它会中断{{1 }})

.$^()[]*+

更强大的解决方案将涉及pl / pgSQL,如rfusca的回答。

答案 5 :(得分: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');

答案 6 :(得分:-1)

我的例子:

int
  1. 反转所有字符串
  2. 子字符串
  3. 相反的结果