我想知道我们有什么选择不做动态查询。
例如:
IF @Mail <> ''
BEGIN
SELECT @Where = @Where + ' AND Mail = @Mail '
END
ELSE IF @Phone <> ''
BEGIN
SELECT @Where = @Where + ' AND Phone like ''%'' + @Phone '
END
我不想这样做,我想避免动态查询,如果有人可以帮助我。
顺便说一句,我希望按Mail
进行过滤,但如果Mail
不存在,那么我必须按Phone
进行过滤,但不要两者都进行过滤。
答案 0 :(得分:2)
如果您想要提高性能,最好的解决方案是针对每种情况单独进行查询。
Gordon的解决方案很好,但SQL服务器不会使用您可能希望在过滤的列上使用的任何索引。 可以通过添加OPTION(RECOMPILE)来增强它以使用索引,但这将导致每次运行时重新编译查询。如果您的表有很多行(并且您在列上定义了索引),它将显着提高性能,但会降低具有少量行(或没有索引)的表的性能 - 它将具有与动态查询基本相同的性能。
答案 1 :(得分:1)
在性能方面,您可能最好使用动态查询。更简单的查询通常更容易优化。
然而,您可以将where
子句标记为:
where . . . AND
(@Mail = '' or mail = @mail) AND
(@Phone = '' or Phone like '%' + @Phone)
注意:NULL
值用于表示&#34; all&#34;是很常见的。所以更典型的配方是:
WHERE . . . AND
(@Mail IS NULL or mail = @mail) AND
(@Phone IS NULL or Phone like '%' + @Phone)
答案 2 :(得分:0)
对于多个过滤器,动态SQL很有可能表现得更好,因为OR和性能通常在SQL查询中不能相处。
但是,如果“无过滤器值”上的过滤器为NULL,则可以按如下方式编写查询:
Android Studio
使用SELECT Mail, Phone, <other columns here>
FROM table
WHERE Mail = COALESCE(@Mail, Mail)
AND Phone LIKE (COALESCE('%' + @Phone, Phone)
可以轻松将所有''
值转换为NULL
。此外,这将同等地处理nullif(@Mail, '')
和''
。
答案 3 :(得分:0)
你可以试试这个
AND ((ISNULL(@Mail,'') = '' or mail = @mail) OR (ISNULL(@Phone,'') = '' or Phone like '%' + @Phone))
答案 4 :(得分:-1)