2013-07-25 191 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檢查出第二個查詢,它按照您的要求執行相同操作。 –