在T-SQL中,如何编写查询以选择列的任何整数值的行?
例如,数据就像这样
NAME,AGE
A,10
B,20
C,10
D,20
并且<asp:dropdownlist>
有两个选项10,20
,因此用户可以选择10
或20
。如果用户选择10
或20
,则数据被正确拉出,但我怎么说*
条件? - 比如在age
列中为任何值选择所有数据??
我的代码如下,
select ...where (AGE = @AGE)
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="AGE" PropertyName="SelectedValue"
DbType="Int32" DefaultValue="ANY"
此外,以下查询在SSMS中完美运行,但如何在asp.net SqlDataSource中实现此行为?
SELECT * FROM [TABLE] where AGE is not null
如果列AGE是varchar类型,我可以使用'%',但它是一个数字字段
谢谢,
答案 0 :(得分:4)
要提供ALL / ANY选项,您需要指定一个sentinel值 - 一个在数据集中永远不存在的值 - 这样您就可以检查提交给存储过程的变量,以便知道何时忽略变量并使用正确的WHERE子句。
IE:如果下拉列表中的元素显示文本为“All”,值为-1,则以下动态SQL是合适的:
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT *
FROM [YOUR_TABLE]
WHERE 1 = 1 '
SET @SQL = @SQL + CASE
WHEN @age > 0 THEN
' AND age = @age '
ELSE
' AND age IS NOT NULL '
END
BEGIN
EXEC sp_executesql @SQL N'age INT', @age
END
请参阅this link for more details about dynamic SQL in TSQL/SQL Server。
但您不必使用动态SQL - 这是等效的:
IF @age > 0
BEGIN
SELECT *
FROM [YOUR_TABLE]
WHERE age IS NOT NULL
END
ELSE
BEGIN
SELECT *
FROM [YOUR_TABLE]
WHERE age = @age
END
...只是你可以想象如果你有多个彼此独立的参数,它会变得多么笨拙。
答案 1 :(得分:3)
仅使用声明性数据源的标准答案是在SQL语句中使用OR子句
WHERE (age = @age OR @age = -1)
对于某些列类型,您需要与NULL进行比较,但您已经声明-1是此应用程序中此列的sentinel值。用这个来关注性能,最终你可能想要切换到动态sql,但这种技术适用于大多数中等大小的数据集。
答案 2 :(得分:2)
看看这是否适合您。 将“ANY”变为NULL并使用COALESCE与AGE匹配。
如果“param”是“ANY”,那么我们将其变为NULL然后返回“age”,以便一切都匹配。如果“param”是其他任何内容,则只返回具有匹配年龄的行。
CREATE TABLE #table (
age int
)
GO
INSERT INTO #table VALUES (10)
INSERT INTO #table VALUES (20)
INSERT INTO #table VALUES (30)
GO
DECLARE @param varchar(10)
SET @param = 10
SELECT * FROM #table WHERE age = @param
SET @param = 'ANY'
SELECT * FROM #table WHERE age = COALESCE(NULLIF(@param,'ANY'),age)
<强>结果
age
-----------
10
(1 row(s) affected)
age
-----------
10
20
30
(3 row(s) affected)
答案 3 :(得分:1)
不要将其包含在
中答案 4 :(得分:1)
典型的做法是从基本查询开始,该查询返回所有结果:
string sql = "SELECT * FROM [TABLE] WHERE 1=1";
然后,如果您选择了可选参数,请添加到字符串。
sql += " AND AGE = @age";
1 = 1总是评估为真,所以它可以消除你是否需要在可选条件之前放置AND的决定。
要在SqlDataSource中执行此操作,您可能会混合我和OMG Ponies方法:
datasource.SelectCommand = "SELECT * FROM [TABLE] WHERE 1=1 AND (AGE = @age OR @age = -1)";
答案 5 :(得分:0)
您应该将其添加为可选的select子句,例如......
SELECT *
FROM <Table>
WHERE (@Age is Null OR @Age = '' OR @Age = Age)
现在,如果您为age返回null或空值,则会被忽略。
答案 6 :(得分:0)
如果您想要一个查询,您可以传入一个参数并使用这两个条件,那么您可以使用类似
的内容Select Name, Age from
(
SELECT
(CASE
WHEN @p1 = '*' THEN '*'
ELSE CONVERT(NVarChar,Age)
END) AS SearchCriteria,
Name,
Age
FROM table
)
t
where SearchCriteria = @p1
参数必须是NVarchar,但可以是'*'或'10'或'20'
警告。性能不会很好(好吧,如果表有很多行,那将会非常糟糕)。如果您希望所有年龄段都不需要将所有内容转换为字符串,那么使用值0可能会更好。
答案 7 :(得分:0)
无论用户选择什么,您是否尝试对所有情况使用一个SQL查询? 根据用户选择,使用两个不同的查询会容易得多。当用户选择“ANY”
时SELECT * FROM Table WHERE @Age > 0
这符合所有年龄段。
答案 8 :(得分:0)
要回答原始问题,或者至少回答“SQL LIKE%for INTEGERS”问题的标题,只是因为标题会有其他人来到这个页面 - 就像我一样。
鉴于你有表'年龄'
NAME,AGE
A,10
B,20
C,10
D,20
E,11
你希望所有年龄在10-19岁或者年龄(* 0)的人都需要一个类似于整数的人 以下是如何使用子查询完成此操作:
SELECT * FROM (SELECT CAST(AGE AS VARCHAR) as Age FROM Ages) tmp where Age like '1%'
OR
SELECT * FROM (SELECT CAST(AGE AS VARCHAR) as Age FROM Ages) tmp where Age like '%0'
玩得开心