Форум: "Базы";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
ВнизПоиск Найти похожие ветки
← →
Филиппов Стас (2002-04-13 18:14) [0]Подскажите пожалуйста как можно произвести следующий поиск.
В БД имеется поле ART
ART
1234
1 23/4
12-34
1.23_4
Как можно введя 1234 в любых вариациях (с/без пробелов и т.п.)
получить все записи.
Другими словами поиск или фильтрация с игнорированием каких либо символов.
← →
Anatoly Podgoretsky (2002-04-13 18:16) [1]Толко сканирование
← →
DPetrovich (2002-04-13 19:49) [2]Возможно можно сделать следующим образом.
Создаём в Delphi функцию, которой в качестве параметра передаётся строка типа "1.23_4"
function TForm1.Strforlike(s1: string): string;
var i,s: integer; str1: string;
set1: set of char;
begin
set1:=["1","2","3","4","5","6","7","8","9","0"];
str1:="%";
for i:=0 to length(s1) do
if s1[i] in set1
then str1:=str1+s1[i]+"%";
result:=str1;
end;
И тогда можно в запросе написать where ART like str2 {=Strforlike(s1)} ...
← →
Deniz (2002-04-15 06:30) [3]
> DPetrovich © (13.04.02 19:49)
Так не получится, потому как запрос ... where ART like str2... обработает только str2("1234"), а 12-34 туда не попадет.
Здесь поможет только сканирование, причем я так понимаю что порядок (1234 или 1243) тоже играет роль.
← →
Johnmen (2002-04-15 09:32) [4]SELECT * FROM TBL WHERE FLD LIKE "%1%2%3%4%"
← →
Anatoly Podgoretsky (2002-04-15 10:30) [5]Это вернет м 1234 и 4321 м abc1
хотя это можно использовать как первичное условие, а затем наложить локальный фильтр
← →
kalex77 (2002-04-15 10:34) [6]select * from art
where
art like "%1%"
or
art like "%2%"
or
art like "%3%"
or
art like "%4%"
;
← →
Johnmen (2002-04-15 10:40) [7]>Anatoly Podgoretsky © : Это ты мне ? Если да, то вернет все записи, в которых встречается 1,2,3,4 именно в такой последовательности и разделенные любым количеством любых символов или не разделенные вовсе...
← →
Anatoly Podgoretsky (2002-04-15 10:44) [8]Johnmen © (15.04.02 10:40)
Вообще то тебе, но не буду утверждиать, так как в такой форме не видел запросов, но если ты гарантируешь, что это именно так, вернет только 1234 в данной последовательности и ничего другого то задача решена. Правда мне кажется, что последний % в этом случае ошибка.
← →
Johnmen (2002-04-15 11:01) [9]>Anatoly Podgoretsky © :
Согласен, что запрос действительно чуден.
Но он решает проблему, и можно утверждать, что будут отобраны все записи, в которых типа ...1...2...3...4...
Последний % тоже нужен, ведь за 4 м.б. что-то еще...
← →
roottim (2002-04-15 11:35) [10]Johnmen © (15.04.02 11:01) прав
% это всеравно что маска!
← →
roottim (2002-04-15 11:38) [11]+ если вместо % использовать "_" это укажет на 1 произвольный символ, % дает нное кол-ао
← →
DPetrovich (2002-04-15 11:53) [12]По-моему, это всё-таки не совсем то потому как запрос
SELECT * FROM TBL WHERE FLD LIKE "%1%"
выдаст не только номера типа "1_","1." и тд, но и "123" и "12_3"...
← →
Johnmen (2002-04-15 12:12) [13]>DPetrovich © : Конечно ! Но задача ставится ...1...2...3...4...,
а не ...1... !
← →
DPetrovich (2002-04-15 12:28) [14]>Johnmen © (15.04.02 12:12)
Ну если номера только 4-х значные, то да...
← →
sniknik (2002-04-15 12:35) [15]DPetrovich © слушай надоело. вместо демагогии проверь реально.
тот селект что Johnmen © писал работает именно так как в задаче было поставлено! а чего еще надо?
← →
DPetrovich (2002-04-15 12:47) [16]>sniknik © (15.04.02 12:35)
Спасибо за ценный совет!
← →
Filippov Stas (2002-04-17 11:49) [17]Спасибо, но я видимо не уточнил вопрос.
Записей неограниченное количество и из скольких угодно символов.
Запрос который написал Johnmen © работает, но вазвращает все записи где есть 1234 в том числе и 1 98 2 76 34.
А как можно сделать такой же поиск, но вводимые символы должны идти подряд. Если введено 123, то и в ответе ...123... идут подряд. Но все еже остается требование игнорирования всех символов кроме цифр и букв.
Спасибо.
← →
Anatoly Podgoretsky (2002-04-17 14:48) [18]Возвращайся к предложению
Anatoly Podgoretsky © (13.04.02 18:16)
тем более что другие предложенные не совсем поиск, а фильтрация
← →
Filippov Stas (2002-04-17 15:55) [19]А не подскажите как работает это сканирование.
← →
DPetrovich (2002-04-17 18:37) [20]Фильтровать можно в обработчике события OnFilterRecord для DataSet"а - в строке для поиска и в значении соответсвующего поля DataSet"а убрать лишние символы и проверить на совпадение...
← →
Anatoly Podgoretsky (2002-04-17 18:44) [21]
Result := False;
Table.First;
while not Table.Eof do begin
if анализ then begin
Result :=True;
Exit;
end
else begin
Table.Next;
end;
end;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c