Tenho a seguinte tabela:
==========================================================
| Name_Level_Class_Section | Phone Num |
==========================================================
| Jacky_1_B2_23 | 1122554455 |
| Johnhy_1_B2_24 | 1122554455 |
| Peter_2_A5_3 | 1122554455 |
==========================================================
Estou pensando em simplificar minha instrução SQL da seguinte forma:
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
Para que quando eu executar o SQL, ele me dê o seguinte resultado:
==========================================================
| 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 |
==========================================================
Existe alguma maneira de simplificar meu SQL?
Você pode usar
cross apply
e o terceiro parâmetro decharindex
para obter a posição dos sublinhados.Resultado:
Atualização: Usando sua tabela, a consulta ficaria assim:
Atualização 2:
Se você sabe com certeza que seu valor nunca contém um ponto
.
e que é sempre um nome de quatro partes, você pode usar parsename .PARSENAME foi mencionado como uma solução se a string não contivesse um ponto. Se ele usar essa modificação para alterar os pontos para outra coisa, analise o valor e coloque os pontos de volta
Você pode usar o seguinte UDF (função em linha em vez de escalar)
Como usar: