Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有Null和“”的SQL搜索查询_Sql_Database_Sql Server 2008_Null - Fatal编程技术网

具有Null和“”的SQL搜索查询

具有Null和“”的SQL搜索查询,sql,database,sql-server-2008,null,Sql,Database,Sql Server 2008,Null,我正在为应用程序生成一个查询。数据库是在SQL Server 2008中设置的。我想使用一个类似于下面的查询,但是,我将使用这个“Where”子句来处理大约4个使用相同要求的其他列。这是测试null或在VarChar255且允许null的列中的适当方法 理想情况下,如果变量@UutSerialNumber为null或空,我希望得到所有结果,但如果不是,我希望使用'LIKE'子句。这是正确的方法吗?它会起作用吗?在我开始向Where子句添加更多列之前,它似乎一直有效 另外,如何使用相同类型的查询处

我正在为应用程序生成一个查询。数据库是在SQL Server 2008中设置的。我想使用一个类似于下面的查询,但是,我将使用这个“Where”子句来处理大约4个使用相同要求的其他列。这是测试null或在VarChar255且允许null的列中的适当方法

理想情况下,如果变量@UutSerialNumber为null或空,我希望得到所有结果,但如果不是,我希望使用'LIKE'子句。这是正确的方法吗?它会起作用吗?在我开始向Where子句添加更多列之前,它似乎一直有效

另外,如何使用相同类型的查询处理文本数据类型

选择DeviceName,UutStatus 从MyTable 其中,类似于“%”+@UutSerialNumber+'%”的UutSerialNumber或类似于“%”的UutSerialNumber和@UutSerialNumber=或@UutSerialNumber的UutSerialNumber为空且


谢谢你的帮助。谢谢大家

这似乎是SQL的重复,但最好的方法是在性能方面使用IF。。。否则

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子句,并且您发布的查询距离不远,则可以在WHERE子句中执行该操作。它只是缺少额外的括号以及一个冗余子句

SELECT  DeviceName, UutStatus 
FROM    MyTable 
WHERE   (ISNULL(@UutSerialNumber, '') = '' OR UutSerialNumber LIKE '%' + @UutSerialNumber + '%')
AND     (ISNULL(@AnotherParameter, '') = '' OR AnotherColumn LIKE '%' + @AnotherParameter + '%')
将文本类型转换为VARCHARMAX

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

WHERE   (ISNULL(@UutSerialNumber, '') = '' OR CHARINDEX(@UutSerialNumber, UutSerialNumber) > 0)
这只不过是一个脚注,但由于我没有做任何性能测试,我只是认为它更容易在眼睛上

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

如果您认为需要,请将“%”添加到最后一个@UutSerialNumber中

您对该筛选器有何期望:或者类似“%”的UutSerialNumber?我觉得这意味着选择所有内容。因此,如果参数为null或,则不在该列上进行筛选。但在or上有该参数,因此如果UutSerialNumber有某个值,而这与选择所有值不同,因为这不计算null值,则不会对其进行筛选,与参数的值无关,如果可能,应避免使用文本数据类型。你们能使用varcharmax吗?不幸的是,我一直使用“text”数据类型。它只针对一列,但仍然是查询的一部分:。这似乎是我想要的工作方式。杰出的但是,如何对文本列使用此查询。它似乎不接受文本作为输入参数。您指的是文本数据类型吗?试着将其转换为varchar。如果查询10万行,转换为varchar的效率不是很高吗?有什么解决方法吗?改变表结构,使列存储为varcharmax,从而消除转换的需要?Text和nText是obselete,将从SQL的未来版本中删除,因此为了将来的校对,无论如何都值得更改列数据类型。我为此使用的数据库无法修改。这个数据库有一些限制,因为它用于我无法控制的实时数据。我当时所能想到的没有解决办法,我不认为转换为varcharmax会导致100k行的性能显著下降。