Asp.net SQL server条件选择语句

Asp.net SQL server条件选择语句,asp.net,sql-server,Asp.net,Sql Server,好吧,这可能很简单,但我就是搞不懂 我正在创建一个页面,该页面将查询具有许多列的表,并且大多数项不是唯一的。我需要能够得到一个记录列表,尽可能多地匹配(最多4个)搜索条件 例如: 我正在用户搜索以下项目,我在文本框中至少输入一个项目,最多输入4个项目: 姓名、年龄、性别、体重(用户可以填写,也可以不填写) 如果他只是在“F”中输入性别,那么他将得到一份数千名女性的名单,其中包括她们的姓名、年龄、性别和体重 然而,如果他输入“F”表示性别,输入“300”表示体重,他将得到一个小得多的返回记录列表

好吧,这可能很简单,但我就是搞不懂

我正在创建一个页面,该页面将查询具有许多列的表,并且大多数项不是唯一的。我需要能够得到一个记录列表,尽可能多地匹配(最多4个)搜索条件

例如:

我正在用户搜索以下项目,我在文本框中至少输入一个项目,最多输入4个项目: 姓名、年龄、性别、体重(用户可以填写,也可以不填写)

如果他只是在“F”中输入性别,那么他将得到一份数千名女性的名单,其中包括她们的姓名、年龄、性别和体重

然而,如果他输入“F”表示性别,输入“300”表示体重,他将得到一个小得多的返回记录列表

我需要能够创建一个sql语句,该语句可以使用该功能执行搜索


advTHANKSance

我使用了与下面类似的方法来执行您正在尝试的操作:

DECLARE @Gender varchar(1)
DECLARE @Age int
DECLARE @Weight int
DECLARE @Name varchar(64)

 SELECT * FROM MyTable
    WHERE
    (@Gender is null OR Gender = @gender)
    AND (@weight is null OR Weight = @weight)
    AND (@Age is null OR  age = @Age)
    and (@Name is null OR Name = @Name)
如果要创建一个存储过程(我建议这样做),它将如下所示:

CREATE PROCEDURE SelectRecords
    @Gender varchar(1),
    @Age int,
    @Weight int,
    @Name varchar(64)
AS
     SELECT * FROM MyTable
        WHERE
        (@Gender is null OR Gender = @gender)
        AND (@weight is null OR Weight = @weight)
        AND (@Age is null OR  age = @Age)
        and (@Name is null OR Name = @Name)

此存储过程所做的是检查是否传入了特定参数的值。如果没有,则它将为null,并且条件为true。如果您这样做了,那么它将不会为null,并且第二个条件必须计算为true才能返回记录。

鉴于您正在使用ASP.NET,您可以看看LINQ to SQL,它以一种非常优雅的方式解决了这个问题:

var query = db.T_Persons;
if (txtGender.Text != string.Empty)
    query = query.Where(x => x.Gender == txtGender.Text);
if (txtWeigth.Text != string.Empty)
    query = query.Where(x => x.Weight == int.Parse(txtWeight.Text));
...

当然,您需要使用.NET 3.5或更高版本。

我是通过将空检查与参数相结合来实现这一点的。如果为空,则所有内容都包含在内,如果不是,则其他部分实际上很重要

CREATE myFunnyProc ( @p1 nvarchar(10), @p2 nvarchar(10) ) AS BEGIN
    SELECT * FROM dbo.myReallyLongTable table
    WHERE
             (@p1 is null or table.name LIKE @p1) 
        AND  (@p2 is null or table.age  = @p2)

END

我经常看到下面的SQL语句(其中,
@gender
@weight
@age
、和
@name
由用户的数据填充,
gender
weight
age
name
是表字段):


Edit:我只是想简单解释一下为什么对不熟悉
coalesce
的任何人都可以这样做。
coalesce
函数接受传递给它的2的第一个非空值。因此,如果@parameter中有什么内容,这意味着用户为该字段输入的数据,它将检查该字段是否等于als用户输入的值;如果用户未输入任何内容且@parameter为null,它将针对第二个值进行测试,该值是字段本身-由于字段始终等于自身,因此将返回所有记录-它根本不会基于此字段进行筛选。)

答案是大多数人试图避开的是动态sql

我建议您为此创建一个可以调用的存储过程,但下面是代码。您需要将表名替换为tablename

Declare 
    @gender varchar(1),
    @weight int,
    @age int,
    @name varchar(100), 
    @sql varchar(200),
    @variableCount int

set @variableCount = 0 

set @sql = 'select * from tablename'

if(@gender is not null)
Begin
@sql += ' where gender = @gender'
@vaiableCount = @VariableCount+1
End

if(@weight is not null)
Begin
if(@variableCount = 0)
Begin
@sql += ' Where ' 
End 
else 
@sql += ' And '
@sql += 'weight = @weight'
End

if(@age is not null)
Begin
if(@VariableCount = 0)
Begin
@sql += ' where '
End
else 
@sql += ' And '
@sql += 'age = @age'
End

if(@name is not null)
Begin
if(@VariableCount = 0)
Begin
@sql += ' where '
End
else 
@sql += ' And '
@sql += 'name = @name' 
End

execute @sql 

@Abe-如果SELECT语句中的年龄和体重不在姓名和性别之间,您的解决方案将起作用。我知道,因为我在SQL Server 2008上尝试过:)。我做了一个表格,上面有许多零散的记录。我还做了一个proc,当输入年龄或体重作为参数时,按您编写的方式运行它不会返回行。我将SELECT语句中基于int的参数移到了列表的顶部或底部,两者都起作用。但是在select语句中的字符串参数之间嵌套int参数,然后指定int参数会导致失败

那么,为什么原始版本不起作用呢??)有人吗


顺便说一句,合并根本不起作用(是的,我对它进行了测试,并在proc中对SELECT语句重新排序)。它看起来应该可以工作…

是否有什么东西使它与带有WHERE子句的标准SELECT有所不同?例如,从表中选择*其中性别='F'和权重=300您使用的是什么版本的.NET framework?一种简单的方法是根据所选的标准以编程方式生成WHERE子句……但是如果这样做,请非常小心可能的SQL注入漏洞!我的回答和Steven说的一样,不允许注射。下一个问题是:有时我运行它,需要2分钟,有时需要2秒钟……每次运行前你是否清除缓存?查看下面的链接,了解您应该如何以及为什么这样做。再看看这个过程。我从不检查列是否有null值,而是检查传入的参数是否为null。因此,在您的示例中,它将返回所有32岁的女性,名为bob(听起来像一位屠夫女士),而不管她的体重。这不是您期望的结果吗?这是一个非常好的解决方案,我没有意识到您正在检查参数值,我只是最初认为您正在检查空列。又干得好!在我看来,使用聚结是一种更干净的方法。你说过,“因为场总是等于它自己”。这并不总是正确的,因为NULL。具体地说,如果列允许空值,并且您为@Variable传递空值,那么该行将被错误地过滤掉。如果相关列不允许null,这是一种完全可以接受的方法。这似乎有点过于复杂(而且它使用动态SQL)。我推荐我的方法。在这种情况下,您在通过linq to sql将查询发送到数据库之前构建查询。和我在sql查询中做的一样。如果使用linq to sql,这可能是一个可接受的替代方案。您的语句与代码不匹配。与参数不匹配的非空值将不会在上述代码中返回。请澄清。我认为你使用的三重否定是令人困惑的。你似乎对这条线很感兴趣,很抱歉你的被记下来了。不,dynsql不是唯一的答案。不过,这是其中之一。
Declare 
    @gender varchar(1),
    @weight int,
    @age int,
    @name varchar(100), 
    @sql varchar(200),
    @variableCount int

set @variableCount = 0 

set @sql = 'select * from tablename'

if(@gender is not null)
Begin
@sql += ' where gender = @gender'
@vaiableCount = @VariableCount+1
End

if(@weight is not null)
Begin
if(@variableCount = 0)
Begin
@sql += ' Where ' 
End 
else 
@sql += ' And '
@sql += 'weight = @weight'
End

if(@age is not null)
Begin
if(@VariableCount = 0)
Begin
@sql += ' where '
End
else 
@sql += ' And '
@sql += 'age = @age'
End

if(@name is not null)
Begin
if(@VariableCount = 0)
Begin
@sql += ' where '
End
else 
@sql += ' And '
@sql += 'name = @name' 
End

execute @sql