SQL搜索查询带空和''

时间:2012-02-02 14:44:33

标签: sql database sql-server-2008 null

我有一个我正在为应用程序构建的查询。数据库是在SQL Server 2008中设置的。我想使用类似于下面的查询,但是,对于使用相同要求的大约4个其他列,我将使用此“Where”子句。这是在VarChar(255)的列中测试null或''并且允许空值的适当方法。

理想情况下,如果变量@UutSerialNumber为null或为空(''),我想要所有结果,但如果不是,我想使用'LIKE'子句。这是正确的做法吗?它会起作用吗?它似乎工作,直到我开始向Where子句添加更多列。

另外,我如何使用相同类型的查询处理“text”数据类型?

SELECT DeviceName, UutStatus FROM MyTable WHERE (UutSerialNumber LIKE '%' + @UutSerialNumber + '%' OR UutSerialNumber LIKE '%%' AND (@UutSerialNumber = '' OR @UutSerialNumber IS NULL)) AND ...

帮助表示赞赏。谢谢大家!

2 个答案:

答案 0 :(得分:1)

它看起来像是SQL的重复,但最好的方法是在性能方面使用IF ... ELSE

IF ISNULL(@UutSerialNumber, '') = '' 
    BEGIN
        SELECT  DeviceName, UutStatus 
        FROM    MyTable 
        -- MORE EXPRESSIONS
    END
ELSE 
    BEGIN
        SELECT  DeviceName, UutStatus 
        FROM    MyTable 
        WHERE   (UutSerialNumber LIKE '%' + @UutSerialNumber + '%' 
        -- MORE EXPRESSIONS
    END

如果您在多个列上执行此操作,并且您发布的查询距离不远,则可以在WHERE子句中完成它只是缺少额外的括号以及具有冗余子句。

SELECT  DeviceName, UutStatus 
FROM    MyTable 
WHERE   (ISNULL(@UutSerialNumber, '') = '' OR UutSerialNumber LIKE '%' + @UutSerialNumber + '%')
AND     (ISNULL(@AnotherParameter, '') = '' OR AnotherColumn LIKE '%' + @AnotherParameter + '%')

将文本类型转换为VARCHAR(MAX)。

作为一个脚注,我个人会使用CHARINDEX而不是连接字符串:

WHERE   (ISNULL(@UutSerialNumber, '') = '' OR CHARINDEX(@UutSerialNumber, UutSerialNumber) > 0)

这只不过是一个脚注,但由于我没有进行任何性能测试,我认为这样做更容易!

答案 1 :(得分:1)

SELECT DeviceName, UutStatus 
FROM MyTable 
WHERE ((@UutSerialNumber = '') OR (@UutSerialNumber is null)) OR (UutSerialNumber like @UutSerialNumber)

如果您认为需要

,请将'%'添加到最后一个@UutSerialNumber