【问题标题】:inner join on temp table unless it is empty临时表上的内部联接,除非它是空的
【发布时间】:2013-02-20 06:41:29
【问题描述】:

我想对临时表进行内部连接,但前提是另一个变量不为 NULL?例如,我有一个用户表,我传入一个字符串,其中用户 ID 用分号分隔。我将它读入一个临时表,并针对用户表进行内部连接,但前提是用户 ID 的字符串不为空。否则我想返回所有用户行。

stored proc 有一个变量传入:

@UidList             varchar(max),

这是一串用户ID,用分号分隔。 这变成了一个临时表

DECLARE @List TABLE (UserUid uniqueidentifier NOT NULL)

然后另一个函数将传入的字符串转换为表格

IF @UidList IS NOT NULL
INSERT INTO @List(UserUid)
SELECT ItemUid
FROM dbo.AFN_ConvertUidListToTable(@UidList)

然后我加入用户表

select * from users 
...
inner join @List on users.userid = @List.UserUid`

但是如果传入的字符串@UidList 为空,那么我想匹配用户表中的所有行。

【问题讨论】:

  • 你能分享你的代码吗?
  • 一行代码讲了1000多个字,或者那句话又是怎么回事?

标签: sql sql-server tsql


【解决方案1】:
declare @tmp table (id int)

--insert into @tmp values (1)

Select * from a
where 
(
ID in (Select ID from @tmp)
or 
(Select Count(ID)  from @tmp)=0
)

http://sqlfiddle.com/#!3/a1a22/10

【讨论】:

  • 鉴于问题状态“但仅当用户 ID 的字符串不为空”时,您可能可以通过换出选择计数而侥幸...
【解决方案2】:

确定这只是查看用户标识字符串和分支的情况吗?

IF @UserIds IS NULL
  select * from users
ELSE
  'stuff involving tempdb

【讨论】:

  • 我可以分支,但我正试图降低代码大小。我在这里省略了很多细节。实际查询是相当大的,分支整个查询将是不优雅的
  • 很公平 - 只是要注意优雅不会让你付出太多的性能
【解决方案3】:
DECLARE @UserCount INTEGER

SELECT @UserCount = COUNT(1) FROM #UserIDList

IF @UserCount > 0
BEGIN
  SELECT UserTable.* FROM UserTable JOIN #UserIDList ON UserTable.ID = #UserIDList.ID
END
ELSE
BEGIN
  SELECT UserTable.* FROM UserTable
END

【讨论】:

  • 我可以分支,但我正试图降低代码大小。我在这里省略了很多细节。实际查询是相当大的,分支整个查询将是不优雅的
【解决方案4】:

如果@UidList IS NULL,左连接将从用户表中获取所有记录:

SELECT users.* 
FROM users
LEFT JOIN @List 
ON @List.UserUid = users.userid
WHERE @List.UserUid IS NOT NULL
OR @UidList IS NULL

但如果@UidList 不为空,那么我们正在寻找匹配项。

【讨论】:

  • @Joe 这里被拉到一个语句中
猜你喜欢
  • 2013-10-20
  • 2015-10-08
  • 2018-12-08
  • 2012-09-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
相关资源
最近更新 更多