Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поис (без учитывания знаков и символов) [D7, MSSQL]


Страницы:   1 2 3

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, '-', '%') и все


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо