SQL if(exists())查询重复

Joe*_*ich 3 sql

我需要编写一个从表中获取一组信息的查询,但如果没有该特定客户端的信息,则使用默认集.我想知道是否有办法避免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,他的名字拼写正确

Tom*_*m H 6

你可以这样做:

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)