Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
bilov Member Откуда: Санкт-Петербург Сообщений: 498 |
Здравствуйте. Мне в запросе нужно искать очищенные строки. На практике обычно где-то 98% их уже чистые, но иногда попадаются нет. И поэтому надо очищать, раньше стояло тупо много replace(replace(replace(replace(... . Теперь я задумался об ускорении и сделал так @n_orig varchar(100) set @n_orig = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace( @n_orig, ' ', ''),'.', ''),',', ''),';', ''),'*', ''),'-', ''),'+', ''),'''', ''),'"', ''),'(', ''),')', ''), '\', ''), '/', '') if isnull(ltrim(rtrim(@n_orig)),'')<>'' select @C_Tov = code from aiv_TovarsUnion where case when n_orig like '%[| |.|,|;|*|-|+|''''|"|(|)|\|/]%' escape '|' then replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace( n_orig, ' ', ''),'.', ''),',', ''),';', ''),'*', ''),'-', ''),'+', ''),'''', ''),'"', ''),'(', ''),')', ''), '\', ''), '/', '') else n_orig end = @n_origв aiv_TovarsUnion пока 200 тыс записей. Скажите пожалуйста не будет ли этот like как-нибудь влиять на результат запроса по сравнению с просто replace, то есть искажать его. И вообще обоснован ли он. Я бегло проверял его производительность и выигрыш был не очень большой, и к тому же у этой проверки был большой случайный разброс |
21 июн 18, 10:27 [21508697] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8320 |
bilov, непонятно о чем вообще вопрос... Реляционная механика не предназначена для подобного. Т.е. все, что Вы ни сделаете в ключе обработки строк - будет неэффективным по сравнению с обработкой, написанной, например, на С. Данные должна храниться в требуемом достоверном виде. То, о чём вы пишете, называется хранением недостоверных данных. |
21 июн 18, 17:41 [21510449] Ответить | Цитировать Сообщить модератору |
bilov Member Откуда: Санкт-Петербург Сообщений: 498 |
Владислав Колосов, Вопрос в том является ли результат того запроса всегда эквивалентным if isnull(ltrim(rtrim(@n_orig)),'')<>'' select @C_Tov = code from aiv_TovarsUnion where replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace( n_orig, ' ', ''),'.', ''),',', ''),';', ''),'*', ''),'-', ''),'+', ''),'''', ''),'"', ''),'(', ''),')', ''), '\', ''), '/', '') = @n_orig. ? По поводу хранения данных без комментариев. Так оно исторически сложилось и я тут не решаю. Обработка - это в смысле CLR-функция на С# например, может когда нибудь по не сейчас |
22 июн 18, 11:20 [21512349] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
Условиеisnull(ltrim(rtrim(@n_orig)),'')<>''эквивалентно этому:
@n_orig>''
Его достаточно добавить в WHERE, - и IF теряет смысл.Главное помнить, что если SELECT не вернёт ни одной записи, @C_Tov останетс со старым значением. А если вернёт более одной записи, то @C_Tov получит одно из значений, но неизвестно какое именно. |
22 июн 18, 11:37 [21512436] Ответить | Цитировать Сообщить модератору |
bilov Member Откуда: Санкт-Петербург Сообщений: 498 |
iap, это то я знаю конечно, я о части запроса после where . То есть где много replace(replace(replace... |
22 июн 18, 14:50 [21513281] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |