小编典典

where子句中的函数调用

sql

我有一个查询,如下所示:

SELECT * FROM Members (NOLOCK) 
 WHERE Phone= dbo.FormatPhone(@Phone)

现在,我明白了必须将格式化应用于列上的变量。但是我应该将其应用于变量以分配给其他局部变量,然后使用它(如下所示)。

Set @SomeVar = dbo.FormatPhone(@Phone)

SELECT * 
  FROM Members (NOLOCK) WHERE Phone= @SomeVar

哪种方法更好或两者都好?

编辑:和第一次查询有何不同

SELECT * FROM Members (NOLOCK) 
 WHERE dbo.FormatPhone(Phone) = @Phone

阅读 167

收藏
2021-04-22

共1个答案

小编典典

与SQL一样,该查询在很大程度上与查询无关,不知道使用实际的架构。

您在Member.Phone上有索引吗?如果否,那么您编写查询的方式就没有关系,它们都将扫描整个表并执行相同的操作(即执行不佳)。如果您
确实有索引, 那么编写查询的方式将带来所有不同:

SELECT * FROM Members WHERE Phone= @Phone;
SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
SELECT * FROM Members WHERE  dbo.FormatPhone(Phone)=@Phone;

首先查询保证最佳,将在索引上寻找电话。
第二个查询取决于dbo.FormatPhone的特征。它可能会或可能不会使用最佳搜索。
上次查询保证是错误的。将扫描表。

2021-04-22