Sybase regexp, substr, instr 函数分割字符串

问题描述 投票:0回答:1

我在表格中有以下数据。

行数 描述
1 名字/姓氏 - 中间名
2 名/姓 - 中间名

我正在寻找如下所需的输出

行数 desc_1 desc_2 desc_3
1 名字 姓氏 中间名
2 名字 姓氏 中间名

在 sybase 中,我无法使用像

SUBSTR(desc,INSTR(desc,' ',1,1) + 1) 
这样的函数。需要一些关于如何在 Sybase 中获得所需结果集的输入

sql sybase substr regexp-substr
1个回答
0
投票

假设:

  • 这是
    Sybase ASE
    所以感兴趣的功能将是
    substring()
    charindex()
  • OP 想要一个基于集合的 SQL 解决方案(例如,我们 not 解析
    @variables
    作为循环/基于游标的构造的一部分)
  • 所有
    desc
    列的格式都是
    firstname/lastname - middlename
    (所以我们可以搜索静态分隔符
    /
    -

一般的做法是使用

charindex()
找到我们的分隔符的位置,然后将这些位置提供给
substring()

由于

ASE
不支持 CTE,我们将使用派生表来生成分隔符起始位置:

select  src.row_num,
        substring([desc], 1,         dt.pos1-1        ) as desc_1,
        substring([desc], dt.pos2+3, 100              ) as desc_2,
        substring([desc], dt.pos1+1, dt.pos2-dt.pos1-1) as desc_3
from    src
join    (select row_num,
                charindex("/",  [desc]) as pos1,
                charindex(" - ",[desc]) as pos2
        from    src) dt
on      src.row_num = dt.row_num
order by 1
go

注意事项:

  • desc
    ASE
    中的保留字,因此需要将名称括起来 (
    [desc]
    )
  • 对于第二个
    substring()
    用至少与
    100
    一样长的数字替换
    desc
  • 我们可以通过用关联的
    dt
    调用替换每个
    dt.posX
    来消除派生表 (
    charindex()
    )(显然
    substring()
    调用会变得有点笨拙)

这会产生:

 row_num desc_1     desc_2      desc_3
 ------- ---------- ----------- ---------
       1 First Name Middle Name Last Name
       2 FirstName  MiddleName  LastName

FWIW,各种 Sybase RDBMS 产品的 SQL 函数/参考手册:

© www.soinside.com 2019 - 2024. All rights reserved.