我有一个我正在为应用程序构建的查询。数据库是在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 ...
帮助表示赞赏。谢谢大家!
答案 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