Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
SELECT Category, COUNT(*) AS Total , (COUNT(*) / (SELECT COUNT(*) FROM Item WHERE Department='Popular')) * 100 AS 'Percentage to all items',
FROM Item
WHERE Department='Popular'
GROUP BY Category;
Я не уверен в синтаксисе MySql, но вы можете использовать подзапрос, как показано.
SET @total=0;
SELECT Category, count(*) as Count, count(*) / @total * 100 AS Percent FROM (
SELECT Category, @total := @total + 1
FROM Item
WHERE Department='Popular') temp
GROUP BY Category;
Преимущество такого способа заключается в том, что вам не нужно дублировать условие WHERE
, которое является тикающей бомбой замедленного действия в следующий раз, когда кто-то приходит обновить условие, но не понимает, что это два разных места.
Избегание условия дублирования WHERE
также улучшает читаемость , особенно , если ваш WHERE
более сложный (с несколькими объединениями и т. д.).
Это должно сделать это:
SELECT I.category AS category, COUNT(*) AS items, COUNT(*) / T.total * 100 AS percent
FROM Item as I,
(SELECT COUNT(*) AS total FROM Item WHERE Department='Popular') AS T
WHERE Department='Popular'
GROUP BY category;