2010-11-24 3 views
1

У меня возник вопрос относительно некоторой инструкции SQL. Я ищу имя, e.x. «Энн Мари Паркер». Этот поисковый запрос передаю моему сценарию.Заменить в SQL-запросе

Скрипт использует следующий SQL код:

SELECT * FROM table WHERE name LIKE '%(searchquery)%' 

(SearchQuery) будет имя, которое я ищу.

Проблема заключается в следующем. Я не только хочу получить Анну Мари Паркер в результате, я также хочу получить результаты с «Энн Паркер».

Есть ли возможность сделать это в моем sql-запросе? Я мог бы подготовить его по коду, но я хочу, чтобы это было сделано в моем sql-запросе.

Есть ли какая-то функция, например, заменить все пробелы на «%», которые затем будут интерпретироваться регулярным выражением?

Большое спасибо и приятный день!

Bye, WorldSignia

+1

Есть часто функции, такие как `` str_replace` или regexp_replace`, которые могут сделать это, но детали отличаются между производителями, поэтому мы должны знать, что база данных (Oracle, MySQL, PostgreSQL, ...), прежде чем мы сможем ответить точно. Если вы можете, посмотрите в строке «замена строки» в своем руководстве к БД. – FrustratedWithFormsDesigner 2010-11-24 18:02:53

+0

Используете ли вы хранимую процедуру для передачи параметров? – Sudantha 2010-11-24 18:04:03

+0

Почему бы вам не поискать что-то вроде «Энн% Паркер»? Пример: `SELECT * FROM table WHERE name LIKE '% Anne% Parker%'` это возвращает то, что вы хотите – cristian 2010-11-24 18:33:29

ответ

0

Вот как я это сделаю.

DECLARE @T VARCHAR(340) 
SET @T ='Anne Parker' 
SELECT @T = 'SELECT * FROM CUSTOMERS WHERE FULLNAME LIKE ''%' + REPLACE(@T,' ','%') + '%'' ORDER BY FULLNAME' 
EXEC (@T); 
0
select 
    * 
from 
    table 
where 
    name like "%anne marie parker%" 
    or name like "%ann parker%" 
1

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

CREATE FUNCTION [dbo].[fn_Utility_ParseDelimitedString] 
    (
     @String varchar(8000), 
     @Delimeter varchar(5) 
    ) 
    RETURNS 
    @ParsedString TABLE 
    (
     StringVal varchar(2000) 
    ) 
    AS 
    BEGIN 

    declare @pos int 
    declare @piece varchar(500) 

    -- Need to tack a delimiter onto the end of the input string if one doesn't exist 
    if right(rtrim(@string),1) <> @Delimeter 
    set @string = @string + @Delimeter 

    set @pos = patindex('%,%' , @string) 
    while @pos <> 0 
    begin 
    set @piece = left(@string, @pos - 1) 

    -- You have a piece of data, so insert it, print it, do whatever you want to with it. 
    INSERT INTO @ParsedString VALUES(cast(@piece as varchar(2000))) 

    set @string = stuff(@string, 1, @pos, '') 
    set @pos = patindex('%'+ @Delimeter +'%' , @string) 
    end 

    RETURN 
END 

тогда ваш запрос будет выглядеть следующим образом:

select * 
from table 
    inner join fn_utility_parsedelimitedstring(@searchquery,' ') list 
     on table.name like '%'+list.Stringval+'%' 

я думаю, что что-то подобное, что поможет вам более полнотекстового поиска чувство , это на самом деле не было протестировано, так YMMV

+0

+1, если только для ответа на заданный вопрос. Но я не могу перестать упоминать, что это «разделитель» (извините). – 2010-11-24 20:17:23

0

Если вы используете MySQL (не ясно, так что я просто угадать), вы должны быть в состоянии сделать это так:

SELECT * FROM table WHERE name RLIKE REPLACE(searchquery, ' ', '.*') 

Разумеется, вам придется иметь дело с поисковым запросом на любом языке, на котором вы запрашиваете. И это медленно, так очень медленно.

Если вы используете MySQL с MyISAM, создавая полнотекстовый индекс на столбце в вопросе, и с помощью MATCH() будет быстрее, и, вероятно, более точным:

SELECT * FROM table WHERE MATCH(name) AGAINST (searchquery) 

Это быстрее, чем RLIKE, но может быть не совсем то, что вы ищете, и если вы не используете MyISAM, вы все равно не сможете его использовать.

0
SELECT * FROM table WHERE name LIKE 'Anne%' and name LIKE '%Parker' 
0

Вот краткое решение:

SELECT * 
FROM table 
WHERE name like 
    Left(@stringval,CharIndex(' ',@stringval)) 
    + '%' 
    + Right(@stringval,CharIndex(' ',Reverse(@stringval))) 

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

Смежные вопросы