2016-01-13 5 views
0

У меня есть результат Select-Заявление со строками в этой форме:SQL - Сортировка после определенного знака

"123400000000020~forename~surname~P50206.00011" 
"123400000111111~forname1~surname1~P50206.00011" 
.... 

Как можно заказать по фамилиям в SQL? Возможно ли, что они могут отрезать струны @ 2-й «~»?

+0

Просим вас пометить ваш вопрос в базе данных, которую вы используете? –

+7

Не храните такие данные, это вызовет у вас массу проблем! Имеют отдельные столбцы для разных значений. – jarlh

+0

Если вы используете SQL Server: http://stackoverflow.com/questions/2647/how-do-i-split-a-string-so-i-can-access-item-x – nicomp

ответ

0

CHARINDEX - ваш друг здесь. Вам нужно будет вложить его в себя и запустить его дважды, потому что вам нужен второй экземпляр.

DECLARE @SearchString nvarchar(max) 
SET @SearchString = '123400000111111~forname1~surname1~P50206.00011' 

DECLARE @Delimiter nvarchar(1) 
SET @Delimiter = '~' 

/* 
SELECT @SearchString AS [Your String] 
--the string puked back 

SELECT 
    RIGHT 
     (
     @SearchString, 
     LEN(@SearchString) - charindex(@Delimiter, @SearchString) 
     ) AS [The First Instance] 
--first instance of @Delimiter 
*/ 

SELECT 
    RIGHT 
    (
     RIGHT 
      (
      @SearchString, 
      LEN(@SearchString) - CHARINDEX(@Delimiter, @SearchString) 
      ), 
      LEN 
      (
       RIGHT(@SearchString, LEN(@SearchString) - CHARINDEX(@Delimiter, @SearchString)) 
      ) - 
      CHARINDEX 
      (
       @Delimiter, RIGHT(@SearchString, LEN(@SearchString) - CHARINDEX(@Delimiter, @SearchString)) 
      ) 
    ) AS [Your Awful Order By] 
--what you're after 

Но за любовь ко всему, что является священным в мире баз данных, а также ради собственного здравого смысла, не говоря уже о производительности, не хранят данные, как это!

+0

спасибо, как я сказал, мы сохранили данные сейчас в отдельных столбцах. Но я попробую это выше. –

0

Я думаю, это поможет вам;

select substr(somedata, regexp_instr(somedata, '(~)', 1, 2, 1) , regexp_instr(substr(somedata, regexp_instr(somedata, '(~)', 1, 2, 1)),  '(~)', 1, 1, 1)-2) as surname from (
select '123400000000020~forename~surname~P50206.00011' as somedata from dual 
    union 
    select '123400000111111~forname1~surname1~P50206.00011' as somedata from dual 
union 
select '123400000000020~forename~surname3~' as somedata from dual 
union 
select '3~~surname5~P50206.00011' as somedata from dual 
) 
order by 1 asc 
Смежные вопросы