поиск в строковых полях учитывая только цифры и буквенные си
От: Аноним  
Дата: 21.01.10 10:08
Оценка:
Как мне произвести поиск в строковых полях учитывая только цифры и .
На примере, что бы было понятно:

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

007 1234567
(007) 123-456-7
...

Нужно набрать 1234567 и найти эти строки.
В этом случае только с цифрами понятно, можно написать функцию SQl которая бы создавала строку только из цифр, и потом с ней сравнивать.

А вот с буквенными символами:

123AB
123-AB
123(AB)

Нужно по 123AB найти эти строки. Причем буквенные символы могут быть символами любого языка. Как можно организовать этот поиск
Re: поиск в строковых полях учитывая только цифры и буквенны
От: Other Sam Россия  
Дата: 21.01.10 10:31
Оценка:
> Как мне произвести поиск в строковых полях учитывая только цифры и .
> На примере, что бы было понятно:
>
> Допустим храним в базе данных телефоны. Каждый набивает их по разному,
> отделяя цифры пробелами или -, иногда некоторые группы включают в скобки.
>
> 007 1234567
> (007) 123-456-7
> ...
>
> Нужно набрать 1234567 и найти эти строки.
> В этом случае только с цифрами понятно, можно написать функцию SQl
> которая бы создавала строку только из цифр, и потом с ней сравнивать.
>
> А вот с буквенными символами:
>
> 123AB
> 123-AB
> 123(AB)
>
> Нужно по 123AB найти эти строки. Причем буквенные символы могут быть
> символами любого языка. Как можно организовать этот поиск
> поиск в строковых полях учитывая только цифры и буквенные си

Я в одном проекте хранил в базе в таблице с телефонами еще одно поле, в
которое помещал обработанный номер телефона — только цифры. И при поиске
искал в том поле.
Для "(007) 123-456-7" я записывал "0071234567", а искал по like '%1234%'
Posted via RSDN NNTP Server 2.1 beta
Re[2]: поиск в строковых полях учитывая только цифры и букве
От: Аноним  
Дата: 21.01.10 13:02
Оценка:
OS>Я в одном проекте хранил в базе в таблице с телефонами еще одно поле, в
OS>которое помещал обработанный номер телефона — только цифры. И при поиске
OS>искал в том поле.
OS>Для "(007) 123-456-7" я записывал "0071234567", а искал по like '%1234%'

С данной задачей великолепно справляются созданные функции на строне базы, где я из строки выделяю только символы и цифры. Алгоритм великолепно работает для латинских букв, потому что коды букв имеют определенные значения. Для любого языка алгоритм уже не работает, неизвестен диапазон испльзуемых символов для любого языка. Нужно что то типа \w в regEx
Re: поиск в строковых полях учитывая только цифры и буквенны
От: ZAMUNDA Земля для жалоб и предложений
Дата: 21.01.10 15:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>123AB

А>123-AB
А>123(AB)

А>Нужно по 123AB найти эти строки. Причем буквенные символы могут быть символами любого языка. Как можно организовать этот поиск

Мб сделать функцию, которая убирает из строки все НЕ-цифры и НЕ-буквы, этих знаков не так много. Т.к. вам так вано на SQL реализовать, то IMHO это решение более реально.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[2]: поиск в строковых полях учитывая только цифры и букве
От: Аноним  
Дата: 21.01.10 15:41
Оценка:
А>>Нужно по 123AB найти эти строки. Причем буквенные символы могут быть символами любого языка. Как можно организовать этот поиск
ZAM>Мб сделать функцию, которая убирает из строки все НЕ-цифры и НЕ-буквы, этих знаков не так много. Т.к. вам так вано на SQL реализовать, то IMHO это решение более реально.

Да, именно это и нужно. Но я не могу однозначно определеть множество Букв и Не-Букв для любого языка, при помощи функкций MS-SQL (не получается). Сейчас сделал так: из строки создаю новую строку, в которую копириую все цифры, латинцкие буквы (все это находится до 128 по таблицам ASCII/Unicode), а также все символы коды которых >= 128. Естественно функция работает не верно: например знак № должен высеиваться.
Re[3]: поиск в строковых полях учитывая только цифры и букве
От: ZAMUNDA Земля для жалоб и предложений
Дата: 21.01.10 16:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Нужно по 123AB найти эти строки. Причем буквенные символы могут быть символами любого языка. Как можно организовать этот поиск

ZAM>>Мб сделать функцию, которая убирает из строки все НЕ-цифры и НЕ-буквы, этих знаков не так много. Т.к. вам так вано на SQL реализовать, то IMHO это решение более реально.

А>Да, именно это и нужно. Но я не могу однозначно определеть множество Букв и Не-Букв для любого языка, при помощи функкций MS-SQL (не получается).

Вы меня не поняли. Не надо искать буквы+цыфры -- надо искать всё остальное. Точки, тирэ, запятые и прочее не зависит от кодировки, если можно так сказать. Врядли пользователи будут использовать какие-нибудь заумные значки в телефонах.

А>Сейчас сделал так: из строки создаю новую строку, в которую копириую все цифры, латинцкие буквы (все это находится до 128 по таблицам ASCII/Unicode), а также все символы коды которых >= 128. Естественно функция работает не верно: например знак № должен высеиваться.

А я предлагаю копировать в новую строку символы, которые не входят в набор "специальных". Вот пример (не знаю для какой БД надо, я для MSSQL написал — анонимы его любят :) ):
DECLARE @src AS NVARCHAR(4000)

SET @src = '(007) 123-456-7'

--------------------------------

DECLARE @badSymbols AS NVARCHAR(255)
DECLARE @currSymbol AS NCHAR(1)
DECLARE @pos AS INT
DECLARE @res AS NVARCHAR(4000)

SET @badSymbols = N' .,-:;''"/\?!@#$%^&*()№<>' -- список 'запрещённых' символов
SET @pos = 1
SET @res = @src

WHILE @pos <= LEN(@badSymbols)
BEGIN
    SET @res = REPLACE(@res, SUBSTRING(@badSymbols, @pos,1), '')
    SET @pos = @pos + 1    
END

-------------------------------

SELECT @src AS src, @res AS res
Список символов можно расширять, как видите.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: поиск в строковых полях учитывая только цифры и букве
От: Аноним  
Дата: 21.01.10 16:46
Оценка:
Спасибо, по всей видимости это единственное приемлемое решение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.