系统基础 - 在子句中使用参数 我需要一种在Sybase中执行以下模式的方法: 从tbl中选择 * x in(@list) 选择将是从Web表单传递值的存储过程的一部分。我想

问题描述 投票:0回答:4
选择将是从Web表单传递值的存储过程的一部分。我想允许用户输入0到每个字段的许多搜索键,其中多个值由某些定界线分开。目前,我可以处理0到1个键,但不能处理>1.

我一直在试图找到类似于上面的伪SQL的优雅解决方案,尽管我发现其他DBS似乎具有内置的支持(例如阵列),但似乎没有一个Sybase的简单答案。

任何帮助将不胜感激。请让我知道是否有更多细节会有所帮助。
	
您无法真正在SQL中这样做。 最好的选择是进行字符串比较:

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

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

sql stored-procedures parameters sybase optional-parameters
4个回答
1
投票

declare @list varchar(100) select @list = '1,2,3,4,5' exec('SELECT * FROM tbl WHERE x IN ('+@list+')')


您可以使用Sub Select和

sa_split_list

1
投票
excerpt from

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' );

1
投票
或使用

INNER JOIN

而不是
WHERE

进行过滤

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

我只是回答了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) + ")"

0
投票

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

希望有帮助!


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

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

Cheers

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.