問題描述
當在 SQL SERVER 中查詢的時候,同事遇到一個字段存儲的字符串為用逗號分隔的主鍵 ID 值,格式為:1,2,3,4,這時候需要查詢符合條件的所有數據,所以選擇使用 IN 查詢,但是直接執行會提示錯誤:在將 varchar 值 '1,2,3,4' 轉換成數據類型 int 時失敗。於是咨詢我怎么解決呢?

我看了下錯誤信息,很明顯是因為 IN 的字段是一個 Int 類型,強制把 varchar '1,2,3,4' 轉換成 Int 語法是不允許的,所以查詢失敗。如下解決思路告訴我了同事。
解決思路
如果要使用 IN 就必須把當前字符串 “列的形式” 轉換成 “行的形式” 語法上才行,也就是說把 '1,2,3,4' 的字符串轉換成一個只有一列的表才行,表中有4行數據分別存儲1,2,3,4,這時候就可以正確使用 IN 關鍵字來了。那如何解決就不報錯還能查詢數據呢?解決利器是 SQL SERVER 中表值函數(可以理解是一個有 TABLE 返回值的方法)
在 SQL 中位置在 數據庫名稱 --> 可編程性 --> 表值函數

告訴同事按照這個思路試着寫下,我隨后也寫了一個通用的表值函數給他,廢話不多說,直接上關鍵代碼。
關鍵代碼
CREATE FUNCTION [dbo].[F_SUBSTRINGINTARRAY] ( @STR VARCHAR(1000), --字符串隊列格式為:1,2,3,4 @CHAR VARCHAR(10) --截取字符串的符號:, ) RETURNS @RESULT TABLE(ID INT) AS BEGIN DECLARE @INDEX INT --聲明截取符號的位置 DECLARE @ORDERID INT --聲明獲取的INT編號 --判斷傳遞的字符串不能為空 IF LEN(@STR) > 0 BEGIN --查詢第一個符號,的位置 SET @INDEX = CHARINDEX(@CHAR, @STR) --循環截取字符串 WHILE @INDEX > 0 BEGIN --截取第一個,位置的值 SET @ORDERID = SUBSTRING(@STR, 1, @INDEX - 1) --截取@STR字符串第一個值,截取后變成 2,3,4 SET @STR = SUBSTRING(@STR, @INDEX + 1, LEN(@STR) - @INDEX) --重新給@INDEX賦值 SET @INDEX = CHARINDEX(@CHAR, @STR) --插入到返回的表格中 INSERT INTO @RESULT(ID) VALUES(@ORDERID) END --判斷是否截取到最后一個 IF @INDEX = 0 AND LEN(@STR) > 0 BEGIN --插入到返回的表格中 INSERT INTO @RESULT(ID) VALUES(@STR) END END RETURN END /* 測試當前的函數 --第一種情況 SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1,2,3', ',') --第二種情況 SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1', ',') */ GO
完美解決問題!我很開心能幫到他,同時也得到了一個大大的👍
由於編程能力有限,只考慮到目前幾種情況,如有問題請指正,謝謝了~
總結
當遇到 SQL 語句問題時,先分析錯誤原因,然后思考如何解決的思路,根據思路編寫 SQL 語句,最后通過不斷測試來強化函數,變成通用函數,下次遇到這個問題可以直接調用。
如需轉載請注明出處,謝謝了!
