代码之家  ›  专栏  ›  技术社区  ›  Desert Spider

使用多个分隔符拆分sql

  •  0
  • Desert Spider  · 技术社区  · 4 周前

    我有一个用例,需要用多个分隔符来分隔字符串。

    客户端id
    布拉
    bleh-bleh
    select client_id ,split(client_id,'-')[0] col1` ,split(client_id,'-')[1] col2 from mytbl
    

    退货

    客户端_id col1 col2
    bleh-bleh bleh bleh

    我一直在尝试各种排列来获得两个分隔符,但没有成功。

    select client_id ,split(client_id,'-'||'_')[0] col1` ,split(client_id,'-'||'_')[1] col2 from mytbl
    

    这是错误的,但我想返回的是。。。

    客户端id col1 col2
    等等 等等 等等
    bleh_bleh bleh bleh
    3 回复  |  直到 4 周前
        1
  •  2
  •   byteSlayer    4 周前

    您可以使用 regexp_split_to_array 使用分隔符regex,该regex是短划线或下划线:

    select 
        client_id,
        (regexp_split_to_array(client_id, '[-_]'))[1] col1, 
        (regexp_split_to_array(client_id, '[-_]'))[2] col2 
        from mytbl;
    

    这是一个小提琴POC: https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/13029

        2
  •  0
  •   Zegarek    4 周前

    只要你 translate() 要使用的分隔符的所有替代分隔符: demo

    select client_id
      , split_part(client_id2,'-',1)
      , split_part(client_id2,'-',2)
    from mytbl cross join lateral
    (values(translate(client_id,'_;/','---'))) as v(client_id2)
    
    客户端id 拆分部分 拆分部分
    布拉 等等 等等
    bleh-bleh bleh bleh

    这种方法的好处在于,与regex+数组的想法相比,它运行得更快。演示显示了这个的 3x 由于不受regex和数组开销带来的性能损失的影响,在10k-300k随机样本上速度更快。

        3
  •  -1
  •   Stefanov.sm    4 周前

    使用CTE,使用 regexp_split_to_array 仅一次

    with t as (
     select client_id, regexp_split_to_array(client_id, '-|_') arr
     from the_table
    )
    select client_id, arr[1] col1, arr[2] col2
    from t;
    

    Demo