Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Большой Like и replace  [new]
bilov
Member

Откуда: Санкт-Петербург
Сообщений: 499
Здравствуйте. Мне в запросе нужно искать очищенные строки. На практике обычно где-то 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]     Ответить | Цитировать Сообщить модератору
 Re: Большой Like и replace  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
bilov,

непонятно о чем вообще вопрос... Реляционная механика не предназначена для подобного. Т.е. все, что Вы ни сделаете в ключе обработки строк - будет неэффективным по сравнению с обработкой, написанной, например, на С.
Данные должна храниться в требуемом достоверном виде. То, о чём вы пишете, называется хранением недостоверных данных.
21 июн 18, 17:41    [21510449]     Ответить | Цитировать Сообщить модератору
 Re: Большой Like и replace  [new]
bilov
Member

Откуда: Санкт-Петербург
Сообщений: 499
Владислав Колосов, Вопрос в том является ли результат того запроса всегда эквивалентным
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]     Ответить | Цитировать Сообщить модератору
 Re: Большой Like и replace  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Условие
isnull(ltrim(rtrim(@n_orig)),'')<>''
эквивалентно этому:
@n_orig>''
Его достаточно добавить в WHERE, - и IF теряет смысл.
Главное помнить, что если SELECT не вернёт ни одной записи, @C_Tov останетс со старым значением.
А если вернёт более одной записи, то @C_Tov получит одно из значений, но неизвестно какое именно.
22 июн 18, 11:37    [21512436]     Ответить | Цитировать Сообщить модератору
 Re: Большой Like и replace  [new]
bilov
Member

Откуда: Санкт-Петербург
Сообщений: 499
iap, это то я знаю конечно, я о части запроса после where . То есть где много replace(replace(replace...
22 июн 18, 14:50    [21513281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить