SQL LIKE%for INTEGERS

时间:2010-11-01 02:07:31

标签: asp.net sql sql-server tsql

在T-SQL中,如何编写查询以选择列的任何整数值的行?

例如,数据就像这样

NAME,AGE
A,10
B,20
C,10
D,20

并且<asp:dropdownlist>有两个选项10,20,因此用户可以选择1020。如果用户选择1020,则数据被正确拉出,但我怎么说*条件? - 比如在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类型,我可以使用'%',但它是一个数字字段

谢谢,

9 个答案:

答案 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'

玩得开心