Да, это сокращенная форма
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
Можно использовать что-то как
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
Вы могли использовать:
declare @foo as nvarchar(25)
select @foo = 'bar'
select @foo
Вы могли также просто поместить первый ВЫБОР в подзапрос. Так как большинство оптимизаторов свернет его в константу так или иначе, не должно быть производительности, пораженной в это.
Кстати, так как Вы используете предикат как это:
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. Это могло быть исправлено путем добавления подзапроса дважды, но Вы будете лучше обслуживаться с переменным подходом в этом случае. Эта последняя версия только для демонстрации.
Отношения.
Что Вы имеете в виду точно? Вы хотите снова использовать результат своего запроса для другого запроса?
В этом случае, почему Вы не комбинируете оба запроса путем создания второго поиска запроса в результатах первого (SELECT xxx in (SELECT yyy...)