Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

Поис (без учитывания знаков и символов)   Найти похожие ветки 

 
Jeeb   (2007-04-13 12:02) [0]

Здравствуйте!
Прошу помочь мне.

Есть Edit, в который вводится значение для поиска в базе. Вводится пользователем в таком виде: AU044093FR.
В то время как в базе значения введены в виде: AU04-409-3FR, причем может быть и другое расположение дефисов (точек, запятых и пр.).

Соответственно, если пользователь вводит без дефисов, то информация отсутствует, нужно, чтобы программа не учитывала различные знаки во время поиска по базе, а учитывала только буквы и цифры.

Заранее благодарен за помощь.


 
Johnmen ©   (2007-04-13 12:11) [1]

LIKE "A%U%0%4%4%0%9%3%F%R"


 
clickmaker ©   (2007-04-13 12:11) [2]

хм...
ну как вариант
select * from Table
where replace(Field, "-", "") = SearchString or replace(Field, ",", "") = SearchString or ...

но нельзя ли как-то формализовать данные, наверняка там какая-то логика есть?


 
ЮЮ ©   (2007-04-13 12:18) [3]

Только
 WHERE (Field LIKE "A%") AND (Field LIKE "%U%") AND ... AND (Field LIKE "%R")

P.S. Даже учитывая, что будет долго работать, вернёт больше, чем нужно, например "A0U09344FR".
P.S.S если дефисы так важны, почему бв пользователю их не вводить при поиске? А если так не важны, зачем их хранить в базе? На худой конец, сделать два поле, в одно пользователь вводит AU04-409-3FR, в другое клиент (а лучше сервер в триггере) пишет AU044093FR, по которому, собственно, потом и искать.


 
Jeeb   (2007-04-13 12:21) [4]

clickmaker,
логика есть: AU - Audi, а дальше циферки номера, но как в них происходит расстановка дефисов, я не знаю...

Есть FO10-302-1, а есть просто 16243...

Johnmen,
Тоже думал над этим, но как это сделать?...


 
Johnmen ©   (2007-04-13 12:23) [5]


>  как это сделать?...

Что значит "как"? Молча. Или тихо напевая себе под нос...:)


 
Jeeb   (2007-04-13 12:23) [6]

ЮЮ,
изначально в базу были введены значения по уникальному (оригинальному) коду запчасти для автомобиля. Нужно теперь при осуществлении поиска не учитывать знаки.... Не править же около 5-6000 названий.... Вот...


 
Jeeb   (2007-04-13 12:25) [7]

Johnmen,
я бы с привеликим удовольствием сделал это молча, но, увы, не знаю как.... Подскажи, пожалуйста, если не сложно....


 
ЮЮ ©   (2007-04-13 12:31) [8]

>LIKE "A%U%0%4%4%0%9%3%F%R"
 Красиво и смело !

Не править же около 5-6000 названий.... Вот...
Можно былобы и поправить, не руками же :) Однако есть [1]


 
Jeeb   (2007-04-13 12:33) [9]

ЮЮ,
пойми, это - оригинальные шифры запчасти, если их править, то это будет неправильным...


 
Сергей М. ©   (2007-04-13 12:33) [10]


> Jeeb


Вообще-то немцы, как известно, народ педантичный.

И, если не ошибаюсь, ориг.коды запчастей для Ауди (и не только для этой ТМ) построены по строго определенному шаблону,  которого и следует придерживаться при построении запроса в части условий отбора.


 
Jeeb   (2007-04-13 12:36) [11]

Сергей М.,
я понимаю, что они построены по шаблону, но так же есть запчасти для ВАЗ, УАЗ, Газель, и т.д. Русские - не все настолько педантичны, как немцы... Если бы в базе были только з/ч для Audi, то можно было бы так поступить, но увы.... задавать свой шаблон для каждой марки....


 
ЮЮ ©   (2007-04-13 12:39) [12]

[9] Jeeb   (13.04.07 12:33)
Я и не предлагал править оригинальные значения, а использовать второе. Теперь и этого не предлагаю, ибо с запросом в [1] MS SQL, надеюсь, справится быстро.


 
ЮЮ ©   (2007-04-13 12:45) [13]

> Тоже думал над этим, но как это сделать?...

Строку, введенную пользователем "удлинить" в два раза, вставив "%" после каждого символа. Полученную строку использовать в запросе


 
Jan1   (2007-04-13 12:48) [14]

select *
from (select "A-11-22" as f
union all
select "A1122" as f
union all
select "A/11,22" as f
union all
select "/," as f) q
where f like "%[a-z0-9]%"


 
Jeeb   (2007-04-13 12:48) [15]

С другой стороны, наверное [1] было бы не очено корректно, т.к. пользователь может ввести идентификатор и с символами и без... Это как раз и вводит в заблуждение... Он так же может ввести один дефис правильно, а про второй забыть... Т.е. при поиске надо учитывать только буквы и цифры....


 
ЮЮ ©   (2007-04-13 12:52) [16]

[15] Jeeb   (13.04.07 12:48)
в [1] как раз учитываются только буквы и цифры.
Попробуй, наконец, запрос на своей БД :)


 
Jeeb   (2007-04-13 12:52) [17]

Jan1,
надо учитывать все случаи, а не только случаи с /,-. и пр...

Т.е. надо формировать что-то вроде [1], но учитывая и то, что дефисы могут присутствовать...


 
Jeeb   (2007-04-13 12:55) [18]

ЮЮ,
я могу попробовать именно для AU044093FR, но как сделать удаление всех знаков из Edit, кроме букв и цифр, и добавление знака % после каждого символа..?? сам алгоритм на Delphi мне не понятен... Это по сути просто, как в первом классе, просто я не знаю как...


 
ЮЮ ©   (2007-04-13 13:00) [19]

>
> Т.е. надо формировать что-то вроде [1], но учитывая и то,
> что дефисы могут присутствовать...

в [13] Дефисы в БД учтены . Правильно введенные дефисы в поле поиска тоже будут учтены. Не учтены тольно неправильно введенные дефисы.

Т.е. нельзя найти AU04-409-3FR по AU-04409-3FR. Если хочешь, чтобы искал и в этом случае, то сначала удали символы-разделители из строки поиска, затем, как в [13]


 
ЮЮ ©   (2007-04-13 13:01) [20]

>Это по сути просто, как в первом классе, просто я не знаю как...

Тогда надо переносить в "Начинающим..." :)


 
Сергей М. ©   (2007-04-13 13:03) [21]


> Jeeb   (13.04.07 12:36) [11]


Я особо не в курсе, но думаю, что у каждого производителя есть какие-то шаблонные правила уникальной идентификации своей продукции.

И то, что эти правила различны для различных производителей, не является большим припятствием для твоего сабжа. Достаточно знать эти правила, остальное - дело программерской техники)

Предлагаешь юзеру выбрать конкретного производителя (конкретную линейку продукции и т.д. и т.п.), после чего организуешь ввод по соответствующему шаблону. Введенные при этом данные практически готовы для употребления в кач-ве простейшего условия отбора.

Или наоборот - юзер вводит данные как попало, ты выполняешь парсинг введенных данных на предмет их полного или частичного соответствия одному из известных шаблонов. Если ни один шаблон не обнаружен, юзер получает отлуп (сам виноват !), иначе данные приводятся в полное соответствие шаблонным правилам, после чего они точно так же готовы к употреблению при отборе.


 
Сергей М. ©   (2007-04-13 13:11) [22]


> Jeeb


Именно так и работает довольно известный софт ETKA (интерактивный каталог з/частей VW, Audi и пр.)


 
Sergej ©   (2007-04-13 13:11) [23]

Может так:

FindText:="AU04-409-3FR";
FindText := AnsiReplaceStr(FindText,"-","%");
Query.Sql.Text:="select * from table where field="+findtext;


 
Jeeb   (2007-04-13 13:12) [24]


B:=CCode.Text;
while Pos("-", B)=0 do
 Delete(B, Pos("-", B), 1);
for I:=1 to Length(B) do
 begin
   Insert("%", B, I+1);
 end;


Полученное И вставляю в запрос...

При выполнении этого программа виснет, что не так?


 
ЮЮ ©   (2007-04-13 13:17) [25]

while Pos("-", B) > 0 do
Delete(B, Pos("-", B), 1);

for I:=1 to Length(B) do
begin
  Insert("%", B, I+1);
end;

Полученное И вставляю в запрос...

А смотрел, что получилось?


 
Sergej ©   (2007-04-13 13:17) [26]

К (13.04.07 13:11) [23]
вернее "select * from table where field like "+QuotedStr(findtext);


 
Johnmen ©   (2007-04-13 13:18) [27]


> что не так?

бесконечный цикл


 
Jeeb   (2007-04-13 13:20) [28]


B:=CCode.Text;
while Pos("-", B)>0 do
Delete(B, Pos("-", B), 1);
for I:=1 to Length(B) do
begin
  Insert("%", B, I+1);
end;


Если делать так, то программа не виснет... Но результат поиска - ноль...


 
ЮЮ ©   (2007-04-13 13:20) [29]

while Pos("-", B)   >   0 do
Delete(B, Pos("-", B), 1);

А то получается "до тех пор пока нет сивмола удалять его" :)


 
Jan1   (2007-04-13 13:21) [30]


> LIKE "A%U%0%4%4%0%9%3%F%R"

такая замена не подойдет. так как под % будет понята любая комбинация. и будут лишние записи.


 
Jeeb   (2007-04-13 13:21) [31]

Jan1,
а что вставлять вместо %?


 
ЮЮ ©   (2007-04-13 13:26) [32]

потому что по твоемк алгоритму получишь A%%%%%%%%%%U044093FR

>такая замена не подойдет. так как под % будет понята любая комбинация. и будут лишние записи.

Если есть серри с более чем 10-ю значащими сиволами, поряд 10-ти которых совпал. Такие совпадения, если и будут, то не так страшны, полагаю, чен ненахождение


 
Jan1   (2007-04-13 13:28) [33]

я бы написал простенькую UDF, которая выдерала-бы только числа и буквы.


 
Jeeb   (2007-04-13 13:28) [34]

ЮЮ,

так вот меня и волнует мой алгоритм... я не знаю как по другому сделать, потому сюда и обратился...


 
ЮЮ ©   (2007-04-13 13:30) [35]

ну хотя бы так :)

с := "";
for i := 1 to Length(b) do
  c := c + b[i] + "%";


 
Jeeb   (2007-04-13 13:34) [36]

Эврика!!!!!!!

D:="";
B:=CCode.Text;
while Pos("-", B)>0 do
 Delete(B, Pos("-", B), 1);
for I:=1 to Length(B) do
 begin
   D:=D+B[I]+"%";
 end;


Только как бы это организовать, чтоб учитывались не только знаки дефиса...

Спасибо, ЮЮ....


 
Gadenysh   (2007-04-13 13:37) [37]

ReplaceStr(edit.text, "-", "%") и все


 
Gadenysh   (2007-04-13 13:38) [38]

т.е.
StringReplace(edit.text, "-", "%") и все


 
Gadenysh   (2007-04-13 13:39) [39]

Sergej ©   (13.04.07 13:11) [23]

уже сказал


 
ЮЮ ©   (2007-04-13 13:43) [40]

Повтори

while Pos("-", B)>0 do  Delete(B, Pos("-", B), 1);

столько раз, сколько нужно, чтобы учесть все нежелательные симворлы :)


 
ЮЮ ©   (2007-04-13 13:44) [41]

заменяя "-" на, например, "/", естественно


 
Johnmen ©   (2007-04-13 13:45) [42]


> такая замена не подойдет. так как под % будет понята любая
> комбинация. и будут лишние записи.

Ваши предложения.


 
Jan1   (2007-04-13 13:46) [43]


> Ваши предложения.

[33]


 
Jan1   (2007-04-13 13:47) [44]


> Jeeb   (13.04.07 13:34) [36]

нельзя вставлять %. будешь мусор получать.


 
Johnmen ©   (2007-04-13 13:55) [45]


> [33]

Выдрали. Дальше что?


 
Сергей М. ©   (2007-04-13 13:58) [46]

Удалено модератором
Примечание: завуалированный мат тоже мат


 
Jan1   (2007-04-13 14:11) [47]


> Выдрали. Дальше что?

далее исчем на прямое соответствие.


 
Johnmen ©   (2007-04-13 14:21) [48]


> далее исчем на прямое соответствие.

Т.е. предполагается, что все буквы-цифры мы знаем, причём в правильной последовательности?
А это разные изделия или нет abc-123 и ab-c123?


 
sniknik ©   (2007-04-13 14:25) [49]

> я бы написал простенькую 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 еще первым символом % поставить (а вдруг строка начинается знаком разделителя...)


 
sniknik ©   (2007-04-13 14:26) [50]

> А это разные изделия или нет abc-123 и ab-c123?
ну, судя по описанию в вопросе, это одно изделие


 
Jan1   (2007-04-13 14:28) [51]


> Т.е. предполагается, что все буквы-цифры мы знаем, причём
> в правильной последовательности?
> А это разные изделия или нет abc-123 и ab-c123?

судя по посту автора, нет - это одинаковые.


> практически тоже самое предлагалось в [2]

да, только проще. комбинации не надо будет перечислять.


 
sniknik ©   (2007-04-13 14:32) [52]

> комбинации не надо будет перечислять.
ты их будеш перечислять в UDF, плюс ее придется с собой таскать, плюс внешняя процедура в MSSQL несколько дольше "родной".

так что это еще вопрос что проще.


 
Jan1   (2007-04-13 15:05) [53]


> ты их будеш перечислять в UDF, плюс ее придется с собой
> таскать, плюс внешняя процедура в MSSQL несколько дольше
> "родной".

1. Давайте начнем с того, что [2] не будет правильно работать.
2. надо будет хранить символы которые надо исключить. хоть во временной таблице, хоть в статической.


 
Jan1   (2007-04-13 15:06) [54]

3. Одним запросом привоится поле к нужному виду: только буквы и цифры.


 
sniknik ©   (2007-04-13 15:49) [55]

> 1. Давайте начнем с того, что [2] не будет правильно работать
будет, с теми дополнениями/исправлениями что показаны в [49], а для частного случая (один тип разделителя)  и без этого.

> 2. надо будет хранить символы которые надо исключить. хоть во временной таблице, хоть в статической.
зачем? прямо в запросе и указывать, в [49] исключаются "-" и ",", продолжить цепочку для 10-15 символов, имхо, "легче" одной внешней процедуры.

> 3. Одним запросом привоится поле к нужному виду: только буквы и цифры.
да, и там и там, а если не видно разницы... то выбирается более простой способ (совет не для извращенцев).

еще + в пользу решения на сервере, можно сделать вычисляемое поле, по которому в принципе возможен и индекс... (от параметра какогото там зависит... не хочу искать)


 
Jan1   (2007-04-13 17:17) [56]


> зачем? прямо в запросе и указывать, в [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


 
ANB ©   (2007-04-14 09:25) [57]

Имхо - лучшее решение - дополнительное поле без мусора с индексом по нему.
А изврат с хитрыми лайками по любому вызовет фулл-скан, что не есть хорошо как для сервера, так и для юзера.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.066 c
2-1182214485
Riply
2007-06-19 04:54
2007.07.15
Всегда ли файл "начинается" с начала первого сектора в кластере ?


15-1182058469
Riply
2007-06-17 09:34
2007.07.15
А тем, кто "мы сами не местные" здесь подают ?


15-1182177008
oldman
2007-06-18 18:30
2007.07.15
Все-таки в правильной области я работаю...


2-1182092381
Knob
2007-06-17 18:59
2007.07.15
Смещение компонентов Canvas


2-1182176439
kyro
2007-06-18 18:20
2007.07.15
Заголовки mp3





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский