2015-03-26 1 views
0

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

adr1: RM320 VOTECH (Символьные (10)) аЬс Буфорд ПР,

ADR2: ПОЛЕ АТЛЕТИК BLDG (Символьный (10)) аЬс 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,')),',','') 

Это возвращает: "Ьс Буфорд AVE", когда он должен вернуться "Abc Буфорд пр"

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,')),',','') 

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

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

+0

Это может быть больше, чем вам нужно, но [эта страница] (http://sqlperformance.com/2012/07/t-sql-queries/split-strings) содержит множество подробностей о разделении строк. – Turophile

ответ

0

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

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

select REPLACE('RM320 [email protected] BUFORD AVE,' , 
     LEFT('RM320 [email protected] BUFORD AVE,' , 
     CHARINDEX('@' , 'RM320 [email protected] BUFORD AVE,') 
     ) , ''); 

result: 

abc BUFORD AVE, 

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