Следующее решение:
${var_NAME}
$var_NAME
TARGET_FILE=someFile.txt;
ERR_CNT=0;
for VARNAME in $(grep -P -o -e '\$[\{]?(\w+)*[\}]?' ${TARGET_FILE} | sort -u); do
VAR_VALUE=${!VARNAME};
VARNAME2=$(echo $VARNAME| sed -e 's|^\${||g' -e 's|}$||g' -e 's|^\$||g' );
VAR_VALUE2=${!VARNAME2};
if [ "xxx" = "xxx$VAR_VALUE2" ]; then
echo "$VARNAME is undefined ";
ERR_CNT=$((ERR_CNT+1));
else
echo "replacing $VARNAME with $VAR_VALUE2" ;
sed -i "s|$VARNAME|$VAR_VALUE2|g" ${TARGET_FILE};
fi
done
if [ ${ERR_CNT} -gt 0 ]; then
echo "Found $ERR_CNT undefined environment variables";
exit 1
fi
Нет, SQL Server
повторно использует агрегаты.
Фактически, если вы построите план запроса, вы увидите SUM
в наборе результатов оператора агрегирования (например, Stream Aggregate
), обозначенного как что-то вроде Выражение ****
.
Значение этого выражения позже будет использоваться в качестве входных данных для других операторов.
Вот пример запроса:
SELECT ROUND(SUM(id), -1)
FROM master
GROUP BY
name
ORDER BY
SUM(id) DESC
и его план:
|--Compute Scalar(DEFINE:([Expr1004]=round([Expr1003],(-1))))
|--Sort(ORDER BY:([Expr1003] DESC))
|--Stream Aggregate(GROUP BY:([test].[dbo].[master].[name]) DEFINE:([Expr1003]=SUM([test].[dbo].[master].[id])))
|--Index Scan(OBJECT:([test].[dbo].[master].[ix_name_desc]), ORDERED BACKWARD)
Как видите, агрегирование выполняется один раз и сохраняется в Expr1003
.
Expr1003
затем повторно используется в операторе Sort
(который обрабатывает ORDER BY
) и Compute Scalar
(который обрабатывает ROUND
)