【问题标题】:How to get all position indexes of a specific char in a string?如何获取字符串中特定字符的所有位置索引?
【发布时间】:2019-06-12 16:54:47
【问题描述】:

我正在使用 postgres 和 PgAdmin3。我被卡住了,我什至不知道从哪里开始!

我有一列格式如下:

tvd_unit
YYNNNNNNNNNNNNNYYNNNNN

该列包含22个职位,职位代表行为在特定业务单元中是否活跃,通过是或否(Y或N)

在上面的示例中,参数仅在 1、2、16 和 17 单位中有效。其余的都关闭了,我需要开发一个查询来返回参数激活的每个单元的数量,在上面的例子中,我需要返回:

1, 2, 16, 17

老实说,我不知道如何开始获取单位数量,我需要帮助。

【问题讨论】:

  • 检查这个问题。它可能会帮助你。 stackoverflow.com/questions/34495881/…
  • 谢谢sssssssssssssssssssssssssssssss!它工作得很好!我只是更改为以 000 格式返回
  • @NycolasMerino 看到我的回答。 :D
  • Shawn.X mkRabbany 的评论对我帮助很大!并且是一个解决方案。

标签: sql postgresql select


【解决方案1】:

您可以使用 generate_series 和 substr 从字符串中获取每个元素:

with data as (select 'YYNNNNNNNNNNNNNYYNNNNN' as tvd_unit)
select position,
       substr(tvd_unit, position, 1) as active
FROM data, 
     generate_series(1, length(tvd_unit), 1) g(position)
WHERE substr(tvd_unit, position, 1) = 'Y';
 position | active
----------+--------
        1 | Y
        2 | Y
       16 | Y
       17 | Y
(4 rows)

【讨论】:

    【解决方案2】:

    解决问题的步骤如下。 您可以先构造一个字符串数组:

    postgres=# select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr;
                          arr                      
    -----------------------------------------------
     {Y,Y,N,N,N,N,N,N,N,N,N,N,N,N,N,Y,Y,N,N,N,N,N}
    (1 row)
    

    然后将数组转换成多行并给每一行一个排序号:

    postgres=# with tmp as (                                                                                                           
    select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr
    )
    select
        unnest(arr) as letter,
        generate_series(1,array_length(arr,1),1) as sort
    from
        tmp;
     letter | sort 
    --------+------
     Y      |    1
     Y      |    2
     N      |    3
     N      |    4
     N      |    5
     N      |    6
     N      |    7
     N      |    8
     N      |    9
     N      |   10
     N      |   11
     N      |   12
     N      |   13
     N      |   14
     N      |   15
     Y      |   16
     Y      |   17
     N      |   18
     N      |   19
     N      |   20
     N      |   21
     N      |   22
    (22 rows)
    

    你想要的最终完整的 SQL:

    postgres=# with tmp as (                                                                                                           
    select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr
    )
    ,tmp_2 as (
    select
        unnest(arr) as letter,
        generate_series(1,array_length(arr,1),1) as sort
    from
        tmp
    )
    select * from tmp_2 where letter = 'Y';
     letter | sort 
    --------+------
     Y      |    1
     Y      |    2
     Y      |   16
     Y      |   17
    (4 rows)
    
    postgres=# with tmp as (
    select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr
    )
    ,tmp_2 as (
    select
        unnest(arr) as letter,
        generate_series(1,array_length(arr,1),1) as sort
    from
        tmp
    )
    select letter,array_to_string(array_agg(sort),',') as result from tmp_2 where letter = 'Y' group by letter;
     letter |  result   
    --------+-----------
     Y      | 1,2,16,17
    (1 row)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多