SSMS — SQL — CHARINDEX при возврате каретки

В SQL я пытаюсь взять адрес разной длины и разделить его при возврате каретки на два отдельных поля. У меня есть адрес, успешно разделенный, но время от времени (17 из 300 раз) правая часть адреса оказывается неправильной.

Adr1: RM320 VOTECH(Char(10))abc BUFORD AVE,

Adr2: FIELD ATHLETIC BLDG(Char(10))abc 15TH AVE SE,

Нет пробела до или после возврата каретки.

select replace(RIGHT( REPLACE( 'RM320 VOTECH
abc BUFORD AVE,' , LEFT( 'RM320 VOTECH
abc BUFORD AVE,' , 
CHARINDEX( CHAR( 10 ) , 'RM320 VOTECH
abc BUFORD AVE,' )) , '' ) , CHARINDEX( CHAR( 10 ) , 'RM320 VOTECH
abc BUFORD AVE,' )),',','')

Это возвращает: «bc BUFORD AVE», когда он должен возвращать «abc buford ave»

select replace(RIGHT( REPLACE( 'FIELD ATHLETIC BLDG
abc 15TH AVE SE,' , LEFT( 'FIELD ATHLETIC BLDG
abc 15TH AVE SE,' , 
CHARINDEX( CHAR( 10 ) , 'FIELD ATHLETIC BLDG
abc 15TH AVE SE,' )) , '' ) , CHARINDEX( CHAR( 10 ) , 'FIELD ATHLETIC BLDG
abc 15TH AVE SE,' )),',','')

Это возвращает: "abc 15TH AVE SE" правильно.

Как два одинаковых выбора возвращают разные результаты?


person user3767924    schedule 26.03.2015    source источник
comment
Это может быть больше, чем вам нужно, но на этой веб-странице много подробностей о разделении строк.   -  person Turophile    schedule 27.03.2015


Ответы (1)


Я не думаю, что вам нужны replace( RIGHT( части.

Если вы используете:

select REPLACE( 'RM320 VOTECH@abc BUFORD AVE,' ,
      LEFT( 'RM320 VOTECH@abc BUFORD AVE,' , 
        CHARINDEX( '@' , 'RM320 VOTECH@abc BUFORD AVE,' )
       ) , '' );

result: 

abc BUFORD AVE,

Примечание. Я заменил CHAR(10) на @ для удобства чтения.

person Turophile    schedule 26.03.2015