Jac*_*ack 11 sql-server-2008 sql-server
我有下表:
==========================================================
| Name_Level_Class_Section | Phone Num |
==========================================================
| Jacky_1_B2_23 | 1122554455 |
| Johnhy_1_B2_24 | 1122554455 |
| Peter_2_A5_3 | 1122554455 |
==========================================================
Run Code Online (Sandbox Code Playgroud)
我正在考虑将我的 SQL 语句简化如下:
select
*,
substring(Name_Level_Class_Section,
CHARINDEX('_',Name_Level_Class_Section,
(CHARINDEX('_', Name_Level_Class_Section) + 1)) + 1,
CHARINDEX('_',Name_Level_Class_Section,
(CHARINDEX('_',Name_Level_Class_Section,
(CHARINDEX('_',Name_Level_Class_Section)+1))+1))-
CHARINDEX('_',Name_Level_Class_Section,
(CHARINDEX('_',Name_Level_Class_Section)+1))) as CLA
from
Bookings
order by
CLA asc, Name_Level_Class_Section asc
Run Code Online (Sandbox Code Playgroud)
这样当我执行 SQL 时,它会给我以下结果:
==========================================================
| Name_Level_Class_Section | Phone Num | CLA |
==========================================================
| Jacky_1_B2_23 | 1122554455 | B2 |
| Johnhy_1_B2_24 | 1122554455 | B2 |
| Peter_2_A5_3 | 1122554455 | A5 |
==========================================================
Run Code Online (Sandbox Code Playgroud)
有什么方法可以简化我的 SQL?
Mik*_*son 25
您可以使用cross apply
和 的第三个参数charindex
来获取下划线的位置。
declare @T table
(
Name_Level_Class_Section varchar(25)
)
insert into @T values
('Jacky_1_B2_23'),
('Johnhy_1_B2_24'),
('Peter_2_A5_3')
select substring(Name_Level_Class_Section, P2.Pos + 1, P3.Pos - P2.Pos - 1)
from @T
cross apply (select (charindex('_', Name_Level_Class_Section))) as P1(Pos)
cross apply (select (charindex('_', Name_Level_Class_Section, P1.Pos+1))) as P2(Pos)
cross apply (select (charindex('_', Name_Level_Class_Section, P2.Pos+1))) as P3(Pos)
Run Code Online (Sandbox Code Playgroud)
结果:
-------------------------
B2
B2
A5
Run Code Online (Sandbox Code Playgroud)
更新:使用您的表,查询将如下所示:
select *,
substring(Name_Level_Class_Section, P2.Pos + 1, P3.Pos - P2.Pos - 1) as CLA
from Bookings
cross apply (select (charindex('_', Name_Level_Class_Section))) as P1(Pos)
cross apply (select (charindex('_', Name_Level_Class_Section, P1.Pos+1))) as P2(Pos)
cross apply (select (charindex('_', Name_Level_Class_Section, P2.Pos+1))) as P3(Pos)
order by CLA asc,
Name_Level_Class_Section asc
Run Code Online (Sandbox Code Playgroud)
更新 2:
如果您确定您的值从不包含句点.
并且它始终是一个四部分名称,您可以使用parsename。
select *,
parsename(replace(Name_Level_Class_Section, '_', '.'), 2) as CLA
from Bookings
order by CLA asc,
Name_Level_Class_Section asc
Run Code Online (Sandbox Code Playgroud)