我需要编写一个从表中获取一组信息的查询,但如果没有该特定客户端的信息,则使用默认集.我想知道是否有办法避免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
Run Code Online (Sandbox Code Playgroud)
前两个选择(存在和if的真实部分)完全相同.如果语句为true,我想避免两次运行相同的查询.我知道一旦满足第一个真实条件就存在停止,但这仍然是O(n)最坏的情况.
我知道的另一个选项是将信息放在临时表中并检查信息是否存在,如果没有返回默认信息.
两种方式都可以,但最好的方法是什么?还有其他方法吗?有没有办法在WHERE子句中执行此操作,因为这是唯一不同的东西?
编辑:修复示例返回行而不仅仅是单个项.因此,将select转储到单个变量的答案将等于我假设的临时表.另外,为了不激怒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
Run Code Online (Sandbox Code Playgroud)
(或使用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
Run Code Online (Sandbox Code Playgroud)
或这个:
SELECT
COALESCE(T2.UserID, T1.UserID)
FROM
UserTable T1
LEFT OUTER JOIN UserTable T2 ON
T2.Name = @UserName
WHERE
T1.Name = 'John Skeet'
Run Code Online (Sandbox Code Playgroud)
或这个:
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'
Run Code Online (Sandbox Code Playgroud)