2013-02-19 2 views
1

Я хочу сделать внутреннее соединение с временной таблицей, но только если другая переменная не является NULL? Например, у меня есть пользовательская таблица, и я передаю строку с идентификатором пользователя, разделенным точкой с запятой. Я прочитал это во временную таблицу и внутреннее соединение с пользовательской таблицей, но только если строка userid не равна null. В противном случае я хочу вернуть все пользовательские строки.внутреннее соединение по временной таблице, если оно не пусто

хранимая процедура имеет переменную, передаваемую в:

@UidList    varchar(max), 

это строка пользовательских идентификаторов, разделенных точкой с запятой. Это превратилось в временную таблицу

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.

+2

Вы можете поделиться своим кодом? –

+4

* Строка кода говорит более 1000 слов *, или как эта фраза снова? –

ответ

0

Несомненно, это всего лишь случай поиска строки и ветвления пользователя.

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

Я мог бы разветвить, но я пытаюсь сохранить размер кода. Я оставляю здесь много подробностей. фактический запрос является значительным, а ответвление всего запроса будет inelegant –

+0

достаточно справедливым - просто будьте осторожны, чтобы элегантность не стоила вам слишком высокой производительности. – chrisb

+0

good point Chris –

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 
+0

Я мог бы разветвить, но я пытаюсь сохранить размер кода вниз , Я оставляю здесь много подробностей. фактический запрос является значительным, и разветвление всего запроса будет inelegant –

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

+0

, если задать вопрос: «но только если строка с идентификатором пользователя не равна нулю», возможно, вам удастся сменить выборку ... – chrisb

0

Левое присоединиться подберут все записи из таблицы пользователей, если @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 НЕ NULL , то мы ищем спички.

+0

@Joe Здесь в одном заявлении – criticalfix

+0

это, похоже, работает –