Re: [?] Как парсить строковое поле в MSSQL

From
Jack Tyurin (2:5020/400)
To
Victor Wagner (2:5054/37.63)
Date
2005-08-24T10:29:48Z
Area
SU.DBMS.SQL
From: "Jack Tyurin" <webmaster@insur-cpp.ru>


Tue Aug 23 2005 11:51, Victor Wagner wrote to "Jack Tyurin":
 JT>> Hi All, 
 JT>> Имеется длинное строковое поле с юр. адресом. Данные
 JT>> разделены запятыми (Индекс,Регион,... ,Город,...).
 JT>> Требуется в запросе выделить из строки регион и город.
 JT>> Подскажите пожалуйста как это осуществить. 
 JT>> C U ... 

 VW> Лучше это делать не в запросе, а завести отдельные поля "регион" и
 VW> "город". А еще лучше - отдельную табличку из трех полей "индекс",
[skipped]

Так бы и сделал, но структура уже прописана фирмой 1С.

 VW> В принципе можно сконструировать запрос с address like
 VW> '%,'||город||',%',
 VW> но на сколько-нибудь вменяемого размера базе он будет тормоить.

 VW> В некоторых SQL-серверах есть еще и операция сопоставления с регулярным
 VW> выражением. Там это ещё проще делается, чем с LIKE. Но что LIKE, что
 VW> регулярное выражение - это всегда Full Scan.

 VW> А ведь по самой природе понятия адреса очевидно, что при наличии
 VW> грамотно построенных индексов, искать адреса по городам и регионам
 VW> должно быть заметно быстрее, чем полным перебором.

Нужно не совсем то. Нужно порезать строку еще в select.

C U ...

--- ifmail v.2.15dev5.3
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
SEEN-BY: 46/50 50/203 520 450/159 186 1024 451/30 454/9 461/43 132 640 469/999
SEEN-BY: 4614/20 4616/3 4625/8 4627/10 4641/444 5000/76 5000 5001/5001 5006/1
SEEN-BY: 5007/1 5010/53 70 5011/13 5012/23 46 5015/10 28 5019/31 5020/86 118
SEEN-BY: 5020/175 194 400 545 604 715 758 830 892 894 982 1042 1057 1200 1523
SEEN-BY: 5020/1604 1665 1909 1922 2013 2020 2238 4441 8383 5021/3 29 5022/128
SEEN-BY: 5025/3 750 5026/10 14 45 5027/16 5029/32 5030/115 217 436 473 556 966
SEEN-BY: 5030/1063 1339 1900 5034/13 5035/38 5036/1 34 5040/47 5042/13 5045/7
SEEN-BY: 5047/43 47 5049/1 5051/15 5053/16 5054/1 8 9 28 35 37 45 63 67
SEEN-BY: 5055/95 5057/1 5059/37 5060/88 5061/15 5062/1 5066/18 5069/7
SEEN-BY: 5070/1222 5077/70 5079/23 5080/68 1003 5081/2 5082/6 5083/21 5084/32
SEEN-BY: 5085/13 5090/106 5092/1 5095/20 5099/133 6000/12 254 6009/1
PATH: 5020/400 4441 545 5054/1 37