一列上的TSQL动态筛选器
要查询的表包含以下列:一列上的TSQL动态筛选器,sql,sql-server,variables,dynamic,parameters,Sql,Sql Server,Variables,Dynamic,Parameters,要查询的表包含以下列: (name varchar(50),values varchar(50),description varchar(50)). 用户希望为每个名称选择多个名称和一系列值,例如: select * from table where (name = X and value >=1 and value <= 5 ) AND (name = Y and value >=10 and value <= 25 ) AND etc for
(name varchar(50),values varchar(50),description varchar(50)).
用户希望为每个名称选择多个名称和一系列值,例如:
select *
from table
where (name = X and value >=1 and value <= 5 )
AND (name = Y and value >=10 and value <= 25 )
AND etc for up to 20 factors.
选择*
从桌子上
其中(name=X,value>=1,value=10,value我在这里做4个假设:
您有SQL Server 2008或更高版本(标记仅为SQL Server)
您的条件将始终采用name=Y,value>=10和value的格式。我不知道是否有真正好的方法可以做到这一点,而无需超长的sp或对数据库的多次调用。您是否考虑过只使用代码进行此操作?如果要将其绑定到asp对象,则只需创建一个列表,查询每一行并添加列表的对象然后使用DataSource=list,然后使用DataBind。是的,我将参数选择存储在数据集中,并将其作为表变量传递给存储过程。1,2,4-正确的3.column是varchar,它根据“name”列的类型存储int和char。有没有更好的方法来过滤这样的列?我计划对数值v进行拟合带范围筛选器的值并将其合并查询筛选字符串值(只需选择一个值而不需要选择范围)您的解决方案比我试图解决它的复杂方法简单得多。谢谢!!我真的想不出更好的方法,其他可能是针对不同数据类型的多个列(例如,varcharvalue、intvalue),比较存储为varchar的整数值不起作用,这与ABC
排序在B
之前的方式相同,123
排序在2
之前,即使2明显在123之前。
CREATE TYPE dbo.TableFilter AS TABLE
( Name VARCHAR(50),
LowerValue INT,
UpperValue INT
);
CREATE PROCEDURE dbo.CustomTableFilter @Filter dbo.TableFilter READONLY
AS
SELECT T.*
FROM T
WHERE EXISTS
( SELECT 1
FROM @Filter f
WHERE T.Name = f.Name
AND T.Value >= f.LowerValue
AND T.Value <= f.UpperValue
)
DECLARE @Filter dbo.TableFilter;
INSERT @Filter VALUES ('X', 1, 5), ('Y', 10, 25);
EXECUTE dbo.CustomTableFilter @Filter;