Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2014, 17:43   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Разделить условия на switch case

Ребята, есть небольшой запрос, приведенный ниже.
Как мне его можно разделить на что-то вроде switch case мол если curPosition = '06' значит я обрабатываю один вариант WHERE иначе другой WHERE.

Код:
	SELECT *	INTO #TempMenu FROM [USSD_MENU_MEGAPHONE_TJ].[dbo].[Menu]
	WHERE 
	(@curPosition = '06' 
	AND [ShortNumber] = @shortNumber 
	AND [ParentId] = @curPosition 
	AND ([ServiceId] IS NULL OR [ServiceId] IN (SELECT [ServiceId] FROM [CELL].[SMSSubscriptions].[dbo].[Subscriptions] WITH (NOLOCK) WHERE [MSISDN] = @msisdn)) 
	AND ([ReplyState] IS NULL OR [ReplyState] = @replyState))
	OR 
	(@curPosition <> '06'
	AND [ShortNumber] = @shortNumber 
	AND [ParentId] = @curPosition 
	AND ([ReplyState] IS NULL OR [ReplyState] = @replyState))
	ORDER BY [OrderId]

Последний раз редактировалось coNsept; 21.11.2014 в 18:03.
coNsept вне форума Ответить с цитированием
Старый 21.11.2014, 17:58   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Зачем? И так все отделено. CASE есть, но не для этого случая
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2014, 18:02   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Дело в том что обращение к [CELL].[SMSSubscriptions].[dbo].[Subscriptions] это удаленный SELECT на другой сервер и по этому мне не выгодно делать такой SELECT и делать это обращение удаленное только тогда когда подходящее условие.

Код:
IF (@curPosition = '06')
		BEGIN
			SELECT *	INTO #TempMenu FROM [USSD_MENU_MEGAPHONE_TJ].[dbo].[Menu]
			WHERE 
			(@curPosition = '06' 
			AND [ShortNumber] = @shortNumber 
			AND [ParentId] = @curPosition 
			AND ([ServiceId] IS NULL OR [ServiceId] IN (SELECT [ServiceId] FROM [MOLDCELL].[SMSSubscriptionsTJ].[dbo].[Subscriptions] WITH (NOLOCK) WHERE [MSISDN] = @msisdn)) 
			AND ([ReplyState] IS NULL OR [ReplyState] = @replyState))
		END
	ELSE 
		BEGIN
			SELECT *	INTO #TempMenu FROM [USSD_MENU_MEGAPHONE_TJ].[dbo].[Menu]
			WHERE 
			(@curPosition = '06' 
			AND [ShortNumber] = @shortNumber 
			AND [ParentId] = @curPosition 
			AND ([ServiceId] IS NULL OR [ServiceId] IN (SELECT [ServiceId] FROM [MOLDCELL].[SMSSubscriptionsTJ].[dbo].[Subscriptions] WITH (NOLOCK) WHERE [MSISDN] = @msisdn)) 
			AND ([ReplyState] IS NULL OR [ReplyState] = @replyState))
		END
Можно такой вариант, но SQL ругается что TempMenu
There is already an object named '#TempMenu' in the database.
И в силу не знания языка я не знаю как разделить такое условие чтобы запись происходила именно в темповую таблицу.
coNsept вне форума Ответить с цитированием
Старый 21.11.2014, 18:11   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Уже есть объект под названием '#TempMenu' в базе данных

И что? А он удален после предыдущего выполнения запроса в этой же сессии? Лохмотья за собой нужно чистить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2014, 18:44   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Как бы я не пытался ее удалить, все равно пишет мне что база уже существует.

Последний раз редактировалось coNsept; 21.11.2014 в 18:54.
coNsept вне форума Ответить с цитированием
Старый 21.11.2014, 18:55   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В обоих запросах, что в #1, что в #3 эта таблица один раз создается. Второй вариант побыстрей будет. В одной сессии временные файлы такого рода сами не удаляются. Исключение - файлы созданные в хранимках видимы только в них. Как пытаешься удалить?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2014, 18:59   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

В этом и проблема что я не нахожу подходящего решения, если вы можете мне подсказать как вторым вариантом решить задачу буду вам благодарен.
TempMenu должна быть одна, по разным темповым таблицам записывать данные нельзя.
coNsept вне форума Ответить с цитированием
Старый 21.11.2014, 19:10   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так удаляет?
Код:
if OBJECT_ID('tempdb.dbo.#TempMenu') IS NOT NULL drop table #TempMenu
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.11.2014 в 19:13.
Аватар вне форума Ответить с цитированием
Старый 24.11.2014, 09:09   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
	IF (@curPosition = '06')
		BEGIN
			SELECT *
			INTO #TempMenu
			FROM [USSD].[dbo].[Menu] m
			LEFT JOIN [CELL].[Subscriptions].[dbo].[Subscriptions] s WITH (NOLOCK) ON @curPosition = '06' AND [MSISDN] = @msisdn AND s.[ServiceId] = m.[ServiceId]
			WHERE 
			[ShortNumber] = @shortNumber 
			AND [ParentId] = @curPosition 
			AND ([ReplyState] IS NULL OR [ReplyState] = @replyState)
			AND (@curPosition = '06' AND (m.[ServiceId] IS NULL OR s.[ServiceId] IS NOT NULL)
			OR @curPosition != '06')
			ORDER BY [OrderId]
		END
	ELSE
		BEGIN
			SELECT *	INTO #TempMenu FROM [USSD].[dbo].[Menu]
			WHERE [ShortNumber] = @shortNumber 
			AND [ParentId] = @curPosition 
			AND ([ServiceId] IS NULL OR [ServiceId] IN (SELECT [ServiceId] FROM [CELL].[Subscriptions].[dbo].[Subscriptions] WITH (NOLOCK) WHERE [MSISDN] = @msisdn)) 
			AND ([ReplyState] IS NULL OR [ReplyState] = @replyState) 
			ORDER BY [OrderId]
		END

		IF OBJECT_ID('tempdb.dbo.#TempMenu') IS NOT NULL DROP TABLE #TempMenu
Нет, так тоже не работает.

Цитата:
Msg 2714, Level 16, State 1, Procedure sp_UssdRequest, Line 71
There is already an object named '#TempMenu' in the database.

Последний раз редактировалось coNsept; 24.11.2014 в 10:06.
coNsept вне форума Ответить с цитированием
Старый 24.11.2014, 09:13   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А удалять не после, а до пробовали.

ADD

Короче сейчас попробовал, такая фишка действительно есть. Тут есть два вариаета
1. Оставить как в #1
2. Сделать CREATE TABLE #TempMenu (...), а затем INSERT-ом. При условии что структура результата одинакова
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.11.2014 в 10:01.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
switch и case C++ countteran Общие вопросы C/C++ 18 06.04.2013 20:52
Перемещение из case 1 в case 2(switch(), язык Си) Павел_95 Помощь студентам 13 11.01.2013 14:18
C++ switch case frozen__11 Общие вопросы C/C++ 6 11.11.2012 23:16
switch и case symrak Общие вопросы C/C++ 2 24.01.2012 15:17