回答

收藏

where子句中的函数调用

技术问答 技术问答 301 人阅读 | 0 人回复 | 2023-09-13

我有一个查询,如下所示:* i+ V5 @! N3 l' G+ R- i% j9 }3 @
SELECT * FROM Members (NOLOCK)
% P7 S9 P# z1 A' H0 \& O* M WHERE Phone= dbo.FormatPhone(@Phone)
4 Q  Z# i* F4 F6 ]* J现在,我明白了必须将格式化应用于列上的变量。但是我应该将其应用于变量以分配给其他局部变量,然后使用它(如下所示)。8 V2 V8 }1 K0 ?
Set @SomeVar = dbo.FormatPhone(@Phone)7 ]% Z  l1 r3 q. v7 v& S1 i
SELECT *
* ^: _+ ^% P& u; b# J" i  FROM Members (NOLOCK) WHERE Phone= @SomeVar
% [6 ~; M4 B% O2 o1 r- `哪种方法更好或两者都好?6 Y$ m* r# c8 f4 s3 b! h
编辑:和第一次查询有何不同
5 F2 }5 D0 d  u# r1 p% s& d+ KSELECT * FROM Members (NOLOCK) 6 B$ D/ m! K4 y9 ^
WHERE dbo.FormatPhone(Phone) = @Phone; k  T1 @) {0 n
               
: \8 ~" b  Q& ], n* C! U. D: ^+ e解决方案:0 a& u. V' b" |% g* _( O
               
! z' A! J( T! l& e6 R
7 k7 p1 B% _& j" z! ]/ G+ ?( `+ E! u) h
                与SQL一样,该查询在很大程度上与查询无关,不知道使用实际的架构。' l; W$ j2 o: n7 X' n6 a6 L
您在Member.Phone上有索引吗?如果否,那么您编写查询的方式就没有关系,它们都将扫描整个表并执行相同的操作(即执行不佳)。如果您
4 @" m$ h3 B% D! }确实有索引, 那么编写查询的方式将带来所有不同:) Y6 ]' i+ a1 q7 f2 R' q
SELECT * FROM Members WHERE Phone= @Phone;
. F2 x; Y: I; oSELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
% w0 K7 N  s: u( pSELECT * FROM Members WHERE  dbo.FormatPhone(Phone)=@Phone;
% j2 Y* I$ J, t首先查询保证最佳,将在索引上寻找电话。7 w3 z, f% S0 P$ z& S) t8 g
第二个查询取决于dbo.FormatPhone的特征。它可能会或可能不会使用最佳搜索。
2 M5 f& ~# q% m' `) i上次查询保证是错误的。将扫描表。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则