分割機能:
CREATE FUNCTION fnSplit(@str varchar(max), @dlm char(1))
RETURNS @result TABLE (id int, value varchar(50))
AS BEGIN
DECLARE
@id int, @value varchar(50),
@lastpos int, @pos int, @len int;
SET @id = 0;
SET @len = LEN(@str);
SET @lastpos = 1;
SET @pos = CHARINDEX(@dlm, @str + @dlm);
IF @pos <> 0
WHILE 1 = 1 BEGIN
SET @value = SUBSTRING(@str, @lastpos, @pos - @lastpos);
IF @value <> '' BEGIN
SET @id = @id + 1;
INSERT INTO @result VALUES (@id, @value);
END;
IF @pos > @len BREAK;
SET @lastpos = @pos + 1;
SET @pos = CHARINDEX(@dlm, @str + @dlm, @lastpos);
END;
RETURN;
END
は、リスト内の値だけでなく、それらのインデックスだけでなく、を含む行セットを返すことになります。次に、この方法で関数を使用することができます。
SELECT
…
FROM atable t
LEFT JOIN dbo.Split('3,6,1,9,2,5', ',') s ON t.Value = s.Value
ORDER BY
CASE WHEN s.id IS NULL THEN 2147483647 ELSE s.id END
アプリケーションでそれらを注文する必要があります。それは任意のシーケンスです... –
以下に見られるように、そうすることができます。質問は私がこれをしなければならないのですか?その答えは重要なNOになります。あなたがしようとしていることに対する解決策は非常に脆弱です。 – Bueller
皆さん、アドバイスをいただきありがとうございましたが、私の問題を解決した人はいませんでしたが、正しい方向に私を指摘しました。 – Reaper