将字符串传递给SQL WHERE IN

Ant*_*nto 5 sql sql-server where-in

我正在一个查询页面上,用户选择一个代表不同类型的值,每个类型由一个ID标识.问题是使用WHERE IN方法从数据库中选择这些ID.

这是我的SQL语句

SELECT M.REG_NO, T.TYPE_ID 
    FROM MAIN AS M 
        INNER JOIN CLASSIFICATION AS C 
            ON M.REG_NO = C.REG_NO
        INNER JOIN TYPE AS T 
            ON T.TYPE_ID = C.TYPE_ID
    WHERE T.TYPE_ID IN (@Types)
Run Code Online (Sandbox Code Playgroud)

它适用于单个值,例如.46,但不是如果值在括号中,例如.(46)或('46'),应该是IN的方式.

我正在使用visual studio,它自动生成访问表适配器的方法来获取值,所以我想我必须通过SQL来做到这一点.

我正在传递一个字符串,例如.Types ="46,267,2010",进入适配器方法,该方法将字符串传递给SQL语句中的@Types.

任何帮助都会很棒.谢谢!

Cha*_*ins 10

这是一个非常常见的问题 - 不确定为什么TSQL尚未处理它.无论如何,我发现最适合我的解决方案是将变量转换为表格,然后就可以使用IN()了.

从功能开始:

CREATE Function [dbo].[ParseStringList]  (@StringArray nvarchar(max) )  
Returns @tbl_string Table  (ParsedString nvarchar(max))  As  

BEGIN 

DECLARE @end Int,
        @start Int

SET @stringArray =  @StringArray + ',' 
SET @start=1
SET @end=1

WHILE @end<Len(@StringArray)
    BEGIN
        SET @end = CharIndex(',', @StringArray, @end)
        INSERT INTO @tbl_string 
            SELECT
                Substring(@StringArray, @start, @end-@start)

        SET @start=@end+1
        SET @end = @end+1
    END

RETURN
END
Run Code Online (Sandbox Code Playgroud)

然后使用该功能......

SELECT * 
FROM table
WHERE SomeFieldValue In (Select ParsedString From dbo.ParseStringList(@Types))
Run Code Online (Sandbox Code Playgroud)


Syl*_*ier 5

这是因为你需要用逗号分隔一组值.喜欢

WHERE
T.TYPE_ID IN ('46', '45', '44');
Run Code Online (Sandbox Code Playgroud)

你是使用SQL Server还是Oracle,MySQL?

如果您有一个由多个值组成的字符串,例如

T.TYPE_ID IN ('46,45,44');
Run Code Online (Sandbox Code Playgroud)

您可能需要一个会使您的字符串爆炸的函数使用分隔符(分割或根据您的DBMS调用它)