SQL 拼接字符串 使用IN查詢方法


問題描述

當在 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 語句,最后通過不斷測試來強化函數,變成通用函數,下次遇到這個問題可以直接調用。

 

如需轉載請注明出處,謝謝了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM