2

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

SELECT * FROM tbl WHERE x IN (@list)

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

我一直在尝试为此找到一个类似于上面伪 SQL 的优雅解决方案,虽然我发现其他 DB 似乎有内置的支持方式(例如数组),但它似乎没有一个简单的Sybase 的答案。

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

4

5 回答 5

1

试试这个方法:

declare @list varchar(100)

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

exec('SELECT * FROM tbl WHERE x IN ('+@list+')')
于 2013-02-22T07:55:38.890 回答
1

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

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

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

于 2013-02-21T20:07:06.283 回答
1

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

文档摘录:

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
于 2019-08-28T19:18:08.177 回答
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];

希望有帮助!

于 2013-02-21T20:11:38.623 回答
0

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

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

干杯

于 2016-08-26T07:16:01.093 回答