![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поис (без учитывания знаков и символов) [D7, MSSQL]
Jeeb © (2007-04-13 12:02:00)Здравствуйте!
Прошу помочь мне.
Есть Edit, в который вводится значение для поиска в базе. Вводится пользователем в таком виде: AU044093FR.
В то время как в базе значения введены в виде: AU04-409-3FR, причем может быть и другое расположение дефисов (точек, запятых и пр.).
Соответственно, если пользователь вводит без дефисов, то информация отсутствует, нужно, чтобы программа не учитывала различные знаки во время поиска по базе, а учитывала только буквы и цифры.
Заранее благодарен за помощь.
ANB (2007-04-14 09:25:00) [1]Имхо - лучшее решение - дополнительное поле без мусора с индексом по нему.
А изврат с хитрыми лайками по любому вызовет фулл-скан, что не есть хорошо как для сервера, так и для юзера.
Jan1 (2007-04-13 17:17:00) [2]
> зачем? прямо в запросе и указывать, в [49] исключаются "-
> " и ",", продолжить цепочку для 10-15 символов, имхо, "легче"
> одной внешней процедуры.
легче добавить нужный исключающий символ в таблицу чем, оборачивать 15 скобок. И читать потом легче и сопровождать.
use [pubs]
GO
if object_id('tbl_ExcludedToken') is null
create table [tbl_ExcludedToken] (
[Token] char(1)
)
GO
if not object_id('GetValue') is null
drop function [GetValue]
GO
create function [GetValue] (@String varchar(250))
returns varchar(250)
as
begin
declare @Result varchar(250)
set @Result = @String
select @Result = replace(@Result, [Token], '')
from [tbl_ExcludedToken]
return @Result
end
GO
insert into [tbl_ExcludedToken]
values('/')
GO
insert into [tbl_ExcludedToken]
values(',')
GO
insert into [tbl_ExcludedToken]
values('-')
GO
select [dbo].[GetValue]('A11434-55,66/33')
GO
sniknik (2007-04-13 15:49:00) [3]> 1. Давайте начнем с того, что [2] не будет правильно работать
будет, с теми дополнениями/исправлениями что показаны в [49], а для частного случая (один тип разделителя) и без этого.
> 2. надо будет хранить символы которые надо исключить. хоть во временной таблице, хоть в статической.
зачем? прямо в запросе и указывать, в [49] исключаются "-" и ",", продолжить цепочку для 10-15 символов, имхо, "легче" одной внешней процедуры.
> 3. Одним запросом привоится поле к нужному виду: только буквы и цифры.
да, и там и там, а если не видно разницы... то выбирается более простой способ (совет не для извращенцев).
еще + в пользу решения на сервере, можно сделать вычисляемое поле, по которому в принципе возможен и индекс... (от параметра какогото там зависит... не хочу искать)
Jan1 (2007-04-13 15:06:00) [4]3. Одним запросом привоится поле к нужному виду: только буквы и цифры.
Jan1 (2007-04-13 15:05:00) [5]
> ты их будеш перечислять в UDF, плюс ее придется с собой
> таскать, плюс внешняя процедура в MSSQL несколько дольше
> "родной".
1. Давайте начнем с того, что [2] не будет правильно работать.
2. надо будет хранить символы которые надо исключить. хоть во временной таблице, хоть в статической.
sniknik (2007-04-13 14:32:00) [6]> комбинации не надо будет перечислять.
ты их будеш перечислять в UDF, плюс ее придется с собой таскать, плюс внешняя процедура в MSSQL несколько дольше "родной".
так что это еще вопрос что проще.
Jan1 (2007-04-13 14:28:00) [7]
> Т.е. предполагается, что все буквы-цифры мы знаем, причём
> в правильной последовательности?
> А это разные изделия или нет abc-123 и ab-c123?
судя по посту автора, нет - это одинаковые.
> практически тоже самое предлагалось в [2]
да, только проще. комбинации не надо будет перечислять.
sniknik (2007-04-13 14:26:00) [8]> А это разные изделия или нет abc-123 и ab-c123?
ну, судя по описанию в вопросе, это одно изделие
sniknik (2007-04-13 14:25:00) [9]> я бы написал простенькую UDF, которая выдерала-бы только числа и буквы.
практически тоже самое предлагалось в [2]
> ну как вариант
> select * from Table
> where replace(Field, '-', '') = SearchString or replace(Field, ',', '') = SearchString or
или, с небольшой поправкой
select * from Table
where replace(replace(Field,'-',''),',', '') = SearchString
в несколько вложений, заодно сработает если в одной строке несколько разнотипных разделителей...
дольше чем с LIKE из [1] там по первому символу индекс сработает, но наверное быстрее если в этот LIKE еще первым символом % поставить (а вдруг строка начинается знаком разделителя...)
Johnmen (2007-04-13 14:21:00) [10]
> далее исчем на прямое соответствие.
Т.е. предполагается, что все буквы-цифры мы знаем, причём в правильной последовательности?
А это разные изделия или нет abc-123 и ab-c123?
Jan1 (2007-04-13 14:11:00) [11]
> Выдрали. Дальше что?
далее исчем на прямое соответствие.
Сергей М. (2007-04-13 13:58:00) [12]Удалено модератором
Примечание: завуалированный мат тоже мат
Johnmen (2007-04-13 13:55:00) [13]
> [33]
Выдрали. Дальше что?
Jan1 (2007-04-13 13:47:00) [14]
> Jeeb (13.04.07 13:34) [36]
нельзя вставлять %. будешь мусор получать.
Jan1 (2007-04-13 13:46:00) [15]
> Ваши предложения.
[33]
Johnmen (2007-04-13 13:45:00) [16]
> такая замена не подойдет. так как под % будет понята любая
> комбинация. и будут лишние записи.
Ваши предложения.
ЮЮ (2007-04-13 13:44:00) [17]заменяя '-' на, например, '/', естественно
ЮЮ (2007-04-13 13:43:00) [18]Повтори
while Pos('-', B)>0 do Delete(B, Pos('-', B), 1);
столько раз, сколько нужно, чтобы учесть все нежелательные симворлы :)
Gadenysh (2007-04-13 13:39:00) [19]Sergej © (13.04.07 13:11) [23]
уже сказал
Gadenysh (2007-04-13 13:38:00) [20]т.е.
StringReplace(edit.text, '-', '%') и все