代码之家  ›  专栏  ›  技术社区  ›  MD Sayem Ahmed

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

  •  4
  • MD Sayem Ahmed  · 技术社区  · 14 年前

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

    7 回复  |  直到 6 年前
        1
  •  2
  •   Peter Tillemans    14 年前

    我不知道该怎么做,但是正则表达式函数,如regexp_匹配、regexp_替换、regexp_拆分到_数组,可能是解决问题的另一种方法。

        2
  •  15
  •   rfusca    14 年前

    好。。。

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

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

    Select length('2010-####-3434') - position('#' in reverse_string('2010-####-3434')) + 1;
    
        3
  •  5
  •   Adriano Carneiro Tigran    13 年前

    在这种情况下 char = '.' 需要逃跑。因此,可以编写函数:

    CREATE OR REPLACE FUNCTION last_post(text,char) 
    RETURNS integer LANGUAGE SQL AS $$  
    select length($1)- length(regexp_replace($1, E'.*\\' || $2,''));  
    $$;
    
        4
  •  3
  •   Evan Carroll    7 年前

    9.5 + array_positions

    使用基本 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;
    
        5
  •  2
  •   leonbloy    14 年前

    这个纯SQL函数将提供字符串中字符的最后一个位置,从1开始计算。如果找不到它会返回0…但是(大免责声明)如果字符是某个regex元字符,它将中断。( .$^()[]*+ )

    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的答案。

        6
  •  0
  •   lub0v    8 年前

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

    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');
    
        7
  •  -1
  •   Suraj Rao Aditya Agrawal    6 年前

    我的例子:

    reverse(substr(reverse(newvalue),0,strpos(reverse(newvalue),',')))
    
    1. 反转所有字符串
    2. 子字符串
    3. 反求结果