2013-07-25 138 views
1

我有一个存储的过程,搜索像波纹管:搜索数组元素

BEGIN 
#At first, Search in name of job: 
(SELECT * FROM tb_job WHERE `name` LIKE '%some%' AND `name` LIKE '%thing%') 
UNION 
# second, search for tags: 
(SELECT * FROM tb_job WHERE id IN 
    (
     SELECT idJob FROM 
     (
      (SELECT 2 AS priority1, COUNT(tb_job_tag.idTag) AS priority2, idJob FROM tb_job_tag WHERE idTag IN 
       (SELECT tb_tag.id FROM tb_tag WHERE tag LIKE '%some%' OR tag LIKE '%thing%') 
      GROUP BY tb_job_tag.idJob) 
     UNION 
      (SELECT 1, COUNT(tb_job_tag.idTag), idJob FROM tb_job_tag WHERE idTag IN 
       (SELECT tb_tag.id FROM tb_tag WHERE tag LIKE '%some%' AND tag LIKE '%thing%') 
      GROUP BY tb_job_tag.idJob) 
     ) 
     AS t ORDER BY priority1, priority2 DESC 
    ) 
) 

END 

现在我有2个问题:如何传递字的阵列,并将它们在MySQL分离并在LIKE使用它们?第二,我如何使这个搜索更好?

(我有3table:tb_job,tb_tag,tb_job_tag存储作业的ID和标签的ID)。谢谢你的帮助。

回答

0
/** 
* http://www.aspdotnet-suresh.com/2013/07/sql-server-split-function-example-in.html 
*/ 
CREATE FUNCTION dbo.Array(@String nvarchar(4000), @Delimiter char(1)) 
RETURNS @Results TABLE ([id] [bigint] IDENTITY(1,1) NOT NULL, Items nvarchar(4000)) 
AS 
BEGIN 
    DECLARE @INDEX INT 
    DECLARE @SLICE nvarchar(4000) 
    -- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z 
    --  ERO FIRST TIME IN LOOP 
    SELECT @INDEX = 1 
    WHILE @INDEX !=0 
    BEGIN 
    -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER 
    SELECT @INDEX = CHARINDEX(@Delimiter,@STRING) 
    -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE 
    IF @INDEX !=0 
    SELECT @SLICE = LEFT(@STRING,@INDEX - 1) 
    ELSE 
    SELECT @SLICE = @STRING 
    -- PUT THE ITEM INTO THE RESULTS SET 
    INSERT INTO @Results(Items) VALUES(@SLICE) 
    -- CHOP THE ITEM REMOVED OFF THE MAIN STRING 
    SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX) 
    -- BREAK OUT IF WE ARE DONE 
    IF LEN(@STRING) = 0 BREAK 
    END 
RETURN 
END 

在数据库中执行此功能一次,今天开始访问,你可以写你的查询关键词,比如下面

DECLARE @VALUE VARCHAR(100); 
SELECT TOP 1 @VALUE = Items FROM [dbo].[Array] ('some,thing,like,that' , ',') where id = 2 
PRINT @VALUE 

所有你需要改变的是在select语句ID特定值。它现在只接受字符串值。但是你可以将字符串转换在SQL中使用INT CAST


我刚刚创建着急这个功能,如果您有任何建议/修改,让我知道...

+0

感谢。但我的问题不是分裂一个短语,实际上是访问我的SELECT查询中的每个分离的项目。 – Highlan

+0

@Highlan检查出第二个查询,它按照您的要求执行相同操作。 –