Sybase - 使用IN子句的参数

时间:2013-02-21 20:05:23

标签: sql stored-procedures parameters sybase optional-parameters

我需要一种在Sybase中执行以下模式的方法:

SELECT * FROM tbl WHERE x IN(@list)

select将是从Web表单传递值的存储过程的一部分。我想允许用户为每个字段输入0到多个搜索键,其中输入的多个值由一些分隔符分隔。目前我可以处理0到1个键,但不能处理> 1。

我一直试图找到一个优雅的解决方案,类似于上面的伪SQL,虽然我发现其他数据库似乎有一个内置的方式来支持(例如数组)这似乎没有对Sybase来说是一个简单的答案。

任何帮助将不胜感激。如果更多细节有帮助,请告诉我。

5 个答案:

答案 0 :(得分:1)

你无法在SQL中真正做到这一点。最好的选择是进行字符串比较:

select *
from tbl
where ','+@list+',' like '%,'+x+',%'

或者,如果您将语句创建为动态SQL,则可以将该列表合并到SQL查询字符串中。

答案 1 :(得分:1)

尝试这种方式:

declare @list varchar(100)

select @list = '1,2,3,4,5'

exec('SELECT * FROM tbl WHERE x IN ('+@list+')')

答案 2 :(得分:0)

我刚刚用php和mysql回答了一个非常类似的问题,但我觉得答案同样适用于此,所以我会复制/粘贴它。

我只是在Visual Studio中处理了同样的问题。首先,我创建了一个参数字符串以添加到SQL语句中。你只需要处理问号(?),我所做的大部分都比你需要的更多:

string[] inClause = new string[keywordTerms.Length];

for (int i = 0; i < keywordTerms.Length; i++)
    inClause[i] = ":keyword" + i.ToString("00");

然后在创建我的选择时,我将以下内容放入:

sqlStatement += "WHERE kw.keyword IN (" + String.Join(", ", inClause) + ")"

最后,我在此代码中添加了参数:

for (int i = 0; i < keywordTerms.Length; i++)
    cmd.Parameters.Add(inClause[i], OracleDbType.Varchar2, 20, "keyword").Value = keywordTerms[i];

希望有所帮助!

答案 3 :(得分:0)

不确定是否为时已晚,但这是我在遇到类似用例时发现的,它确实帮助了我。

[1]: https://stackoverflow.com/questions/11101106/sybase-use-parameter-as-where-clause

干杯

答案 4 :(得分:0)

您可以使用子选择和sa_split_list系统过程将列表拆分为单独的值。

摘录自documentation

CREATE PROCEDURE ProductsWithColor( IN color_list LONG VARCHAR )
BEGIN
  SELECT Name, Description, Size, Color
  FROM Products
  WHERE Color IN ( SELECT row_value FROM sa_split_list( color_list ) )
END;
go

SELECT * from ProductsWithColor( 'white,black' );

或者使用INNER JOIN代替WHERE进行过滤

  SELECT Name, Description, Size, Color
  FROM Products
  INNER JOIN sa_split_list( color_list ) FILTER ON FILTER.row_value = Products.Color