1

一時テーブルとの内部結合を行いたいのですが、別の変数が NULL でない場合のみですか? たとえば、ユーザー テーブルがあり、ユーザー ID をセミコロンで区切った文字列を渡します。これを一時テーブルに読み込み、ユーザーテーブルに対して内部結合しますが、ユーザー ID の文字列が null でない場合のみです。それ以外の場合は、すべてのユーザー行を返したいです。

ストアド プロシージャには次の変数が渡されます。

@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 が null の場合、users テーブル内のすべての行を一致させたいと考えています。

4

4 に答える 4

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

于 2013-02-19T20:14:16.077 に答える
0

@UidListがNULLの場合、左結合はユーザーテーブルからすべてのレコードを取得します。

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

ただし、@ UidListがNULLでない場合は、一致するものを探しています。

于 2013-02-19T20:29:57.433 に答える
0

確かに、これはユーザー ID の文字列と分岐を確認するだけの場合ですか?

IF @UserIds IS NULL
  select * from users
ELSE
  'stuff involving tempdb
于 2013-02-19T20:07:40.117 に答える
0
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
于 2013-02-19T20:08:25.193 に答える