gpt4 book ai didi

sql - where 子句中的函数调用

转载 作者:行者123 更新时间:2023-12-02 14:46:16 25 4
gpt4 key购买 nike

我有一个查询如下:

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

最佳答案

与 SQL 一样,如果不知道实际使用的模式,查询在很大程度上是无关紧要的。

您在 Members.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 的特性。它可能会也可能不会使用最佳搜索。
最后一个查询肯定是错误的。会扫描 table 。

此外,我删除了 NOLOCK 提示,这似乎是今天的主题......请参阅 syntax for nolock in sql 。 NOLOCK总是错误的答案。使用快照隔离。

关于sql - where 子句中的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1724325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com