Как сократить запрос?

kika

Всем привет!Плиз, подскажите как сократить запрос:
CASE when @newsid is null then CONVERT(varchar(<b>8</b>), a.Date , <b>104</b>)
		when @newsid is not null then (select CONVERT(varchar(<b>10</b>), a.Date , <b>104</b>) from News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.Name
		when @newsid is not null then (select a.Name from News a where a.ID=@newsid)
	END,
CASE when @newsid is null then a.Name
		when @newsid is not null then (select a.Name from News a where a.ID=@newsid)
	END,
CASE when @newsid is null then a.Name
		when @newsid is not null then (select a.Name from News a where a.ID=@newsid)
	END,
Как мне сократить запрос, чтобы избежать повторений when @newsid is null then ???
7 ответов

kika

Всем спасибо!Получилось!!!Действительно нужно было корректно записать часть после WHERE


kika

Можно использовать CASE-конструкцию 1 раз?


kika

Можно конкретный запрос увидеть, особенно предложение FROM, а не Copy|Paste три раза?


kika

......................................................
UNION ALL
SELECT
	<b>6</b>,
	<b>5</b>,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,

	CASE when @newsid is null then CONVERT(varchar(<b>8</b>), a.Date , <b>104</b>)
		when @newsid is not null then (select CONVERT(varchar(<b>10</b>), a.Date , <b>104</b>) from _News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.Name
		when @newsid is not null then (select a.Name from _News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.Description
		when @newsid is not null then (select a.Description from _News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.ID
		when @newsid is not null then (select a.ID from _News a where a.ID=@newsid)
	END,


	NULL,
	NULL,
	NULL,
	NULL
from
	(select top <b>1</b> * from _News a where a.IDGeography=@Top order by a.Date desc) a
UNION ALL
......................................................
SELECT


kika

Сократить можно немного:
CASE when @newsid is null then CONVERT(varchar(<b>8</b>), a.Date , <b>104</b>)
		ELSE (select CONVERT(varchar(<b>10</b>), a.Date , <b>104</b>) from _News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.Name
		ELSE (select a.Name from _News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.Description
		ELSE (select a.Description from _News a where a.ID=@newsid)
	END,
	CASE when @newsid is null then a.ID
		ELSE (select a.ID from _News a where a.ID=@newsid)
	END,
Вот тока вот само построение запроса меня смущает. Может вместо кучи CASE в подзапросе просто переписать условие:
where (a.IDGeography=@Top) AND ((a.ID = @newsID) OR (@newsID IS NULL))
а в запросе так и выбирать поля, без CASE.


kika

по крайней мере
when @newsid is not null then
на
else
точно можно заменить без потери смысла :)


kika

Так?
......................................................
UNION ALL
SELECT TOP <b>1</b>
	<b>6</b>,
	<b>5</b>,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,

	CONVERT(varchar(<b>8</b>), a.Date , <b>104</b>),
	a.Name,
	a.Description,
	a.ID,

	NULL,
	NULL,
	NULL,
	NULL
from _News a 
where 	(
		(@newsid is null)
		and
		(a.IDGeography=@Top)
	)
	or
	(
		(@newsid is not null)
		and
		(a.ID=@newsid)
	)
order by a.Date desc

UNION ALL
......................................................
SELECT