SQL Server Установка 2005 года переменной к результату запроса Select

Да, это сокращенная форма

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

Она называется условным оператором. Многие люди (ошибочно) называют это тернарным оператором , потому что это единственный тернарный (три аргумент) оператор в Java, C, C ++ и, возможно, многих других языках. Но теоретически там мог бы быть другим тернарным оператором, тогда как может быть только один условный оператор .

Официальное название дано в Java Спецификация языка :

§15.25 Условный оператор? :

Условный оператор ? : использует логическое значение одного выражения для определения того, какое из двух других выражений должно быть оценено.

blockquote>

Обратите внимание, что обе ветви должны приводить к методы с возвращаемыми значениями:

Это ошибка времени компиляции для второго или третьего выражения операнда как вызов метода void.

Фактически, по грамматике выражений выражения ( §14.8 ) не допускается, чтобы условное выражение появлялось в любом контексте, где мог появиться вызов метода void.

blockquote>

Итак, если doSomething() и doSomethingElse() являются недействительными методами, вы не можете сжать это:

if (someBool)
    doSomething();
else
    doSomethingElse();

в это:

someBool ? doSomething() : doSomethingElse();

Простые слова:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

44
задан sealz 7 May 2012 в 14:57
поделиться

4 ответа

Можно использовать что-то как

SET @cnt = (SELECT COUNT(*) FROM User)

или

SELECT @cnt = (COUNT(*) FROM User)

Для этого для работы, ВЫБОР должен возвратить отдельный столбец и единственный результат, и оператор SELECT должен быть в круглой скобке.

Редактирование : Вы попробовали что-то вроде этого?

DECLARE @OOdate DATETIME

SET @OOdate = Select OO.Date from OLAP.OutageHours as OO where OO.OutageID = 1

Select COUNT(FF.HALID) 
from Outages.FaultsInOutages as OFIO 
inner join Faults.Faults as FF 
    ON FF.HALID = OFIO.HALID 
WHERE @OODate = FF.FaultDate
    AND OFIO.OutageID = 1
70
ответ дан Zain Rizvi 26 November 2019 в 22:00
поделиться

Вы могли использовать:

declare @foo as nvarchar(25)

select @foo = 'bar'

select @foo
3
ответ дан JPrescottSanders 26 November 2019 в 22:00
поделиться

Вы могли также просто поместить первый ВЫБОР в подзапрос. Так как большинство оптимизаторов свернет его в константу так или иначе, не должно быть производительности, пораженной в это.

Кстати, так как Вы используете предикат как это:

CONVERT(...) = CONVERT(...)

, что выражение предиката не может быть оптимизировано правильно или индексы использования на ссылке столбцов ПРЕОБРАЗОВАНИЕМ () функция.

Вот один способ сделать исходный запрос несколько лучше:

DECLARE @ooDate datetime
SELECT @ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1

SELECT 
  COUNT(FF.HALID)
FROM
  Outages.FaultsInOutages AS OFIO 
  INNER JOIN Faults.Faults as FF ON 
    FF.HALID = OFIO.HALID 
WHERE
  FF.FaultDate >= @ooDate AND
  FF.FaultDate < DATEADD(day, 1, @ooDate) AND
  OFIO.OutageID = 1

Эта версия могла усилить в индексе, который вовлек FaultDate и достигает той же цели.

Здесь это, переписано для использования подзапроса для предотвращения объявления переменной и последующего ВЫБОРА.

SELECT 
  COUNT(FF.HALID)
FROM
  Outages.FaultsInOutages AS OFIO 
  INNER JOIN Faults.Faults as FF ON 
    FF.HALID = OFIO.HALID 
WHERE
  CONVERT(varchar(10), FF.FaultDate, 126) = (SELECT CONVERT(varchar(10), OO.Date, 126) FROM OLAP.OutageHours AS OO where OO.OutageID = 1) AND
  OFIO.OutageID = 1

Примечание, что этот подход имеет ту же индексную проблему использования как оригинал из-за использования ПРЕОБРАЗОВАНИЯ () на FF.FaultDate. Это могло быть исправлено путем добавления подзапроса дважды, но Вы будете лучше обслуживаться с переменным подходом в этом случае. Эта последняя версия только для демонстрации.

Отношения.

2
ответ дан Pittsburgh DBA 26 November 2019 в 22:00
поделиться

Что Вы имеете в виду точно? Вы хотите снова использовать результат своего запроса для другого запроса?

В этом случае, почему Вы не комбинируете оба запроса путем создания второго поиска запроса в результатах первого (SELECT xxx in (SELECT yyy...)

1
ответ дан Liam 26 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: