假設在預存程序中接收一個逗號分隔的字串參數,該參數表示多個值,例如使用者名稱或帳號。為了根據這些值過濾行,我們需要在WHERE子句中建構一個IN列表。
SQL Server 2005及更高版本中建議的方法是使用表格值函數,例如:
<code class="language-sql">CREATE FUNCTION [dbo].[f_split]( @param NVARCHAR(MAX), @delimiter CHAR(1) ) RETURNS @t TABLE ( val NVARCHAR(MAX), seq INT ) AS BEGIN SET @param += @delimiter; WITH a AS ( SELECT CAST(1 AS BIGINT) AS f, CHARINDEX(@delimiter, @param) AS t, 1 AS seq UNION ALL SELECT t + 1, CHARINDEX(@delimiter, @param, t + 1), seq + 1 FROM a WHERE CHARINDEX(@delimiter, @param, t + 1) > 0 ) INSERT @t SELECT SUBSTRING(@param, f, t - f), seq FROM a OPTION (MAXRECURSION 0); RETURN; END;</code>
要使用此函數將字串解析為IN列表,請建構一個子查詢:
<code class="language-sql">SELECT * FROM yourtable WHERE account IN (SELECT val FROM dbo.f_split(@account, ','))</code>
或者,您可以使用簡單但效率較低的方法,利用LIKE運算子進行模式比對:
<code class="language-sql">WHERE account LIKE '%,' + @account + '%,</code>
相較之下,利用f_split函數可以提供更好的效能,尤其是在處理大型資料集時。
以上是如何有效率地解析 SQL IN 清單的逗號分隔字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!