-1

我有使用以下 SQL,

SELECT * FROM Products P
WHERE  (P.Name LIKE '%'+@Keyword+'%')

现在我需要逐字搜索,这意味着当我输入时,Retina Sony我需要Retina在名称字段AND Sony的名称字段中进行搜索。意味着我需要将关键字中的所有单词与 anme 字段匹配。上面的查询对我不起作用。有什么线索吗?

4

5 回答 5

1

您可以编写一个函数来用空格分割字符串,例如:

CREATE FUNCTION [dbo].[Split]
(
@String VARCHAR(200),
@Delimiter VARCHAR(5)
)

RETURNS @SplittedValues TABLE
(
OccurenceId SMALLINT IDENTITY(1,1),
SplitValue VARCHAR(200)
)

AS

BEGIN

DECLARE @SplitLength INT

WHILE LEN(@String) > 0
BEGIN

SELECT @SplitLength = (CASE CHARINDEX(@Delimiter,@String) WHEN 0 THEN

LEN(@String) ELSE CHARINDEX(@Delimiter,@String) -1 END)

INSERT INTO @SplittedValues

SELECT SUBSTRING(@String,1,@SplitLength)

SELECT @String = (CASE (LEN(@String) - @SplitLength) WHEN 0 THEN ''

ELSE RIGHT(@String, LEN(@String) - @SplitLength - 1) END)

END

RETURN

然后像这样使用这个函数:

SELECT * FROM Products P
WHERE  (P.Name in (Select * from dbo.Split(@Keyword, ' ')) )
于 2013-06-24T05:55:22.923 回答
1

听起来像是全文搜索的完美用例:

CREATE TABLE dbo.Products
(
    ID INT IDENTITY CONSTRAINT PK_Products PRIMARY KEY CLUSTERED,
    Name NVARCHAR(100)
)
GO

CREATE FULLTEXT CATALOG mycatalog;
GO

CREATE FULLTEXT INDEX ON dbo.Products
( 
    Name LANGUAGE 1033
) 
KEY INDEX PK_Products ON mycatalog; 
GO

SELECT  *
FROM    dbo.Products
WHERE   FREETEXT(Name, 'Retina AND Sony') -- will match any text that contains the two words, their inflectional forms or synonyms

有几种搜索方式,以上只是一个例子。

请参阅:http: //msdn.microsoft.com/en-us/library/ms142571.aspx http://msdn.microsoft.com/en-us/library/ms142583.aspx

于 2013-06-25T02:59:10.873 回答
0

这是答案,

SELECT  * from [Products] P
WHERE   NOT EXISTS(SELECT 1 FROM Split(@Keyword,' ') Words WHERE (P.Name NOT LIKE '%' + Words.Items +'%'))

得到它,一个带有多个搜索词的 sql 查询

于 2013-06-24T07:31:00.157 回答
0

使用 if 事件。将输入的字符串转换为数组并尝试:

WHERE  
   (
      P.Name LIKE '%'+@Keyword[0]+'%' OR
      P.Name LIKE '%'+@Keyword[1]+'%'
      ....
   )

这是我的想法。

于 2013-06-24T05:46:56.407 回答
0
CREATE FUNCTION [dbo].[Split]
(
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1)
)
RETURNS TABLE 
AS
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
        SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
        UNION ALL
        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
            FROM Split
            WHERE endpos > 0
    )
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM Split
)
GO

DECLARE @DelimitedString NVARCHAR(128)
SET @DelimitedString = 'Duckman,Cornfed,Ajax,Charles,Mambo'
SELECT * FROM dbo.Split(@DelimitedString, ',')

DECLARE @Keyword nvarchar(128)
SET @Keyword = 'Retina,Cornfed'

select *  from Products p where p.name in 
(SELECT Data FROM dbo.Split(@Keyword, ','))

现在检查这个

这个我已经测试过了,它重新给我的话

于 2013-06-24T07:12:39.380 回答