5

我正在处理一个查询页面,其中用户选择一个代表不同类型的值,每个类型都由一个 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)

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

我正在使用 Visual Studio,它会自动生成访问表适配器以获取值的方法,所以我认为我必须通过 SQL 来执行此操作。

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

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

4

3 回答 3

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

然后使用该功能...

SELECT * 
FROM table
WHERE SomeFieldValue In (Select ParsedString From dbo.ParseStringList(@Types))
于 2011-08-04T16:53:13.487 回答
5

这是因为您需要一组用逗号分隔的值。像

WHERE
T.TYPE_ID IN ('46', '45', '44');

您使用的是 SQL Server 还是 Oracle、MySQL?

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

T.TYPE_ID IN ('46,45,44');

您可能需要一个函数来使用分隔符来分解您的字符串(根据您的 DBMS 拆分或调用任何名称)

于 2011-08-04T16:45:31.030 回答
1

以下Select对我来说很好:

 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 (','+@Types+',') LIKE '%,' +T.TYPE_ID+ ',%'
于 2016-09-28T13:59:46.623 回答