我在表格中有以下数据。
行数 | 描述 |
---|---|
1 | 名字/姓氏 - 中间名 |
2 | 名/姓 - 中间名 |
我正在寻找如下所需的输出
行数 | desc_1 | desc_2 | desc_3 |
---|---|---|---|
1 | 名字 | 姓氏 | 中间名 |
2 | 名字 | 姓氏 | 中间名 |
在 sybase 中,我无法使用像
SUBSTR(desc,INSTR(desc,' ',1,1) + 1)
这样的函数。需要一些关于如何在 Sybase 中获得所需结果集的输入
假设:
Sybase ASE
所以感兴趣的功能将是substring()
和charindex()
@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 函数/参考手册: