gpt4 book ai didi

SQL if(exists())查询重复

转载 作者:行者123 更新时间:2023-12-04 15:47:27 25 4
gpt4 key购买 nike

我需要编写一个从表中获取一组信息的查询,但如果没有该特定客户端的信息,则使用默认设置。我想知道是否有办法避免 if(exists()) 语句中的查询重复。

例如:

IF( EXISTS( SELECT * FROM UserTable WHERE Name = @UserName))
BEGIN
SELECT * FROM UserTable WHERE Name = @UserName))
END
ELSE
BEGIN
SELECT * FROM UserTable WHERE Name = 'Jon Skeet'))
END

前两个选择(exists 和 if 的真实部分)完全相同。如果语句为真,我想避免两次运行相同的查询。我知道一旦满足第一个真实条件,存在就会停止,但这仍然是 O(n) 最坏的情况。

我知道的另一个选项是将信息放在临时表中并检查信息是否存在,如果没有则返回默认信息。

两种方法都可以,但最好的方法是什么?还有其他方法可以做到这一点吗?有没有办法在 WHERE 子句中做到这一点,因为这是唯一不同的地方?

编辑:修复了返回一行而不仅仅是单个项目的示例。因此,将选择转储到单个变量的答案将等于我假设的临时表。另外,为了不激怒 Jon Skeet,请正确拼写他的名字

最佳答案

你可以这样做:

SELECT TOP 1
UserID
FROM
UserTable
WHERE
Name IN (@UserName, 'John Skeet')
ORDER BY
CASE WHEN Name = 'John Skeet' THEN 2 ELSE 1 END

(或使用 LIMIT 或任何适用于您的 RDBMS 的方法)

或者你可以这样做:
DECLARE @UserID INT

SELECT
@UserID = UserID
FROM
UserTable
WHERE
Name = @UserName

IF (@UserID IS NULL)
SELECT
@UserID = UserID
FROM
UserTable
WHERE
Name = 'John Skeet'

SELECT @UserID AS UserID

或这个:
SELECT
COALESCE(T2.UserID, T1.UserID)
FROM
UserTable T1
LEFT OUTER JOIN UserTable T2 ON
T2.Name = @UserName
WHERE
T1.Name = 'John Skeet'

或这个:
SELECT
UserID
FROM
UserTable
WHERE
Name = @UserName

IF (@@ROWCOUNT = 0) -- MS SQL Server specific, your RDBMS method will vary
SELECT
UserID
FROM
UserTable
WHERE
Name = 'John Skeet'

关于SQL if(exists())查询重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/864631/

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