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ですか? 次に、この検索を改善するにはどうすればよいですか?

(私は3つのテーブルを持っています:ジョブのIDとタグのIDを格納するtb_job、tb_tag、tb_job_tag)。ご協力いただきありがとうございます。

4

1 に答える 1

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

データベースでこの関数を1回実行し、特定の値にアクセスするには、以下のようにクエリを記述できます

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

変更する必要があるのは、select ステートメントの id だけです。今のところ、文字列値のみを受け入れます。ただし、SQL で String を Int に変換するには、次を使用します。CAST


提案/変更があれば、私は急いでこの関数を作成しました...

于 2013-08-14T06:29:55.747 に答える