【问题标题】:Pass string into SQL WHERE IN将字符串传递到 SQL WHERE IN
【发布时间】:2011-10-20 04:30:45
【问题描述】:

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

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

【问题讨论】:

  • 不知道 SQL Server,但在 Oracle 中,您不能传入像 @Types 这样的绑定变量 - 您必须为每个 IN 值传入单独的 var 或常量。跨度>

标签: sql sql-server where-in


【解决方案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+ ',%'

【讨论】:

    【解决方案2】:

    这是一个很常见的问题——不知道为什么 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))
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      你可能需要一个函数来分解你的字符串,使用分隔符(根据你的 DBMS 分割或调用它)

      【讨论】:

      • 它的 SQL Server。我尝试输入 ('46', '45', '44') 之类的值,但没有成功。
      • 您的数据类型是什么? '45' 假定 Type_ID 是 char/varchar/nvarchar 数据。如果 Type_ID 是整数,则可以使用 (46,45,44)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多