在SQL查询中替换

时间:2010-11-24 18:00:47

标签: sql sql-server

我对一些SQL语句有疑问。我搜索一个名字,e.x。 “安妮玛丽帕克”。我将这个搜索查询传递给我的脚本。

该脚本使用以下sql代码:

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

(searchquery)将是我要找的名字。

问题如下。我不仅希望得到Anne Marie Parker,我还希望得到“Anne Parker”的成绩。

有没有可能在我的SQL查询中执行此操作?我可以通过代码来准备它,但我希望它可以在我的SQL查询中完成。

是否有某种功能,例如用“%”替换所有空格,然后由正则表达式解释?

非常感谢你,祝你有愉快的一天!

再见 WorldSignia

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

select
  *
from
  table
where
  name like "%anne marie parker%"
  or name like "%ann parker%"

答案 2 :(得分:0)

如果您正在使用MySQL(目前尚不清楚,我只是在猜测),您应该能够这样做:

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

当然,你必须以你正在查询的任何语言恰当地处理searchquery。它很慢,非常慢。

如果你在MyISAM中使用MySQL,在相关列上创建全文索引,并使用MATCH()会更快,可能更准确:

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

它比RLIKE快,但它可能不是你想要的,如果你不使用MyISAM,你也无法使用它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

以下是一个简短的解决方案:

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

如果我对这些职位有点不满意,你将不得不原谅我,但希望这也能解决多个中间人的问题。

答案 5 :(得分:0)

我会这样做。

DECLARE @T VARCHAR(340)
SET @T ='Anne Parker'
SELECT @T = 'SELECT * FROM CUSTOMERS WHERE FULLNAME LIKE ''%' + REPLACE(@T,' ','%') + '%'' ORDER BY FULLNAME'
EXEC (@T);