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

kika

Всем привет!Плиз, подскажите как сократить запрос:
<pre class="prettyprint linenums">CASE when @newsid is null then CONVERT(varchar(8), a.Date , 104) when @newsid is not null then (select CONVERT(varchar(10), a.Date , 104) 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, </pre>
Как мне сократить запрос, чтобы избежать повторений when @newsid is null then ???
7 ответов

kika

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


kika

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


kika

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


kika

<pre class="prettyprint linenums">...................................................... UNION ALL SELECT 6, 5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, CASE when @newsid is null then CONVERT(varchar(8), a.Date , 104) when @newsid is not null then (select CONVERT(varchar(10), a.Date , 104) 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 1 * from _News a where a.IDGeography=@Top order by a.Date desc) a UNION ALL ...................................................... SELECT</pre>


kika

Сократить можно немного:
<pre class="prettyprint linenums"> CASE when @newsid is null then CONVERT(varchar(8), a.Date , 104) ELSE (select CONVERT(varchar(10), a.Date , 104) 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,</pre>
Вот тока вот само построение запроса меня смущает. Может вместо кучи CASE в подзапросе просто переписать условие:
<pre class="prettyprint linenums">where (a.IDGeography=@Top) AND ((a.ID = @newsID) OR (@newsID IS NULL))</pre>
а в запросе так и выбирать поля, без CASE.


kika

по крайней мере
<pre class="prettyprint linenums">when @newsid is not null then</pre>
на
<pre class="prettyprint linenums">else</pre>
точно можно заменить без потери смысла :)


kika

Так?
<pre class="prettyprint linenums">...................................................... UNION ALL SELECT TOP 16, 5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, CONVERT(varchar(8), a.Date , 104), 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 </pre>