Možná jedna z méně známých funkcí FORMAT()
Funkce v SQL Server je funkce, která umožňuje použít podmíněné formátování na číslo.
Je to spíše funkce .NET než funkce SQL Server (nebo T-SQL), ale SQL Server/T-SQL ji podporuje stejně, což vám umožňuje plně využít možnosti použití podmíněného formátování na čísla.
Vše závisí na formátovacím řetězci, který předáte do FORMAT()
funkce.
Můžete předat formátovací řetězec, který určuje, jak má být číslo naformátováno v závislosti na tom, zda je kladné, záporné nebo nulové.
Aby bylo jasno, nemluvím o formátování čísla barvami nebo fonty atd. Mluvím pouze o formátování čísel, které byste normálně použili FORMAT()
funkce pro (jako je přidání oddělovačů tisíců, procent, desetinných míst atd.).
Také toto podmíněné formátování je dosti omezené – lze testovat pouze tři podmínky (kladná, záporná nebo nulová). V případě potřeby však můžete použít stejné formátování na dvě podmínky najednou.
V každém případě zde je návod, jak použít FORMAT()
funkce pro použití podmíněného formátování na číslo v SQL Server.
Představujeme ;
– Oddělovač oddílů
.NET definuje středník (;
) jako jeden ze svých vlastních číselných specifikátorů formátu, označovaný jako oddělovač sekce .
Oddělovač sekcí je specifikátor podmíněného formátu, který definuje sekce se samostatnými formátovacími řetězci pro kladná, záporná a nulová čísla. To vám umožňuje použít na číslo různé formátování v závislosti na tom, zda je jeho hodnota kladná, záporná nebo nula.
Řetězec vlastního číselného formátu může obsahovat až tři části oddělené středníky. Jsou to následující:
- Jedna sekce :V tomto případě neplatí žádné podmíněné formátování. Formátovací řetězec platí pro všechny hodnoty. Není potřeba žádný oddělovač sekcí (protože existuje pouze jedna sekce). Toto je bezpochyby nejběžnější forma formátovacího řetězce.
- Dvě sekce :První část platí pro kladné hodnoty a nuly a druhá část platí pro záporné hodnoty.
Pokud je číslo, které se má formátovat, záporné, ale po zaokrouhlení podle formátu ve druhé části se stane nulou, bude výsledná nula formátována podle první části.
- Tři sekce :První část platí pro kladné hodnoty, druhá část platí pro záporné hodnoty a třetí část platí pro nuly.
Druhý oddíl může zůstat prázdný (tím, že mezi středníky není nic), v takovém případě se první oddíl vztahuje na všechny nenulové hodnoty.
Pokud je číslo, které se má formátovat, nenulové, ale po zaokrouhlení podle formátu v první nebo druhé části se stane nulou, výsledná nula se naformátuje podle třetí části.
Všimněte si, že záporné hodnoty se vždy zobrazují bez znaménka mínus, když jsou použity oddělovače sekcí (ačkoli existují výjimky, jak uvidíte později). Pokud chcete, aby konečná formátovaná hodnota měla znaménko minus, musíte znaménko minus explicitně zahrnout jako součást vlastního formátovacího řetězce. To platí také pro jakékoli jiné již existující formátování spojené s číslem.
Příklad 1 – Jedna sekce (žádné podmíněné formátování)
Zde je typický řetězec číselného formátu skládající se z jedné sekce. Nejsou použity žádné oddělovače sekcí, a proto neplatí žádné podmíněné formátování .
Kód:
SELECT FORMAT(123, '0 (Number)') Positive, FORMAT(-123, '0 (Number)') Negative, FORMAT(0, '0 (Number)') Zero;
Výsledek:
+--------------+---------------+------------+ | Positive | Negative | Zero | |--------------+---------------+------------| | 123 (Number) | -123 (Number) | 0 (Number) | +--------------+---------------+------------+
Všimněte si, že znaménko mínus zůstává nedotčeno. Pokud bychom použili oddělovače sekcí, toto by bylo odstraněno.
Příklad 2 – Dvě sekce (podmíněné formátování)
Zde začíná podmíněné formátování.
V tomto příkladu máme dva oddíly (oddělené jedním oddělovačem oddílů). Část vlevo od oddělovače platí pouze pro hodnoty, které jsou buď kladné, nebo nulové. Část vpravo se vztahuje pouze na záporné hodnoty.
Kód:
SELECT FORMAT(123, '0 (Positive or Zero); 0 (Negative)') Result;
Výsledek:
+------------------------+ | Result | |------------------------| | 123 (Positive or Zero) | +------------------------+
V tomto případě bylo číslo kladné, takže k jeho formátování byla použita první sekce.
Příklad 3 – Dvě sekce (stejný formátový řetězec, různé hodnoty)
V dalším příkladu je stejný formátovací řetězec aplikován na různé hodnoty (kladné, záporné a nulové).
Kód:
SELECT FORMAT(123, '0 (Positive or Zero); 0 (Negative)') Positive, FORMAT(-123, '0 (Positive or Zero); 0 (Negative)') Negative, FORMAT(0, '0 (Positive or Zero); 0 (Negative)') Zero;
Výsledek:
+------------------------+-----------------+----------------------+ | Positive | Negative | Zero | |------------------------+-----------------+----------------------| | 123 (Positive or Zero) | 123 (Negative) | 0 (Positive or Zero) | +------------------------+-----------------+----------------------+
Tento příklad tedy demonstruje skutečnou výhodu oddělovačů sekcí – že můžeme získat jiný výsledek v závislosti na hodnotě.
Příklad 4 – Dvě sekce se zaokrouhlením
Při použití dvou sekcí jsou všechny záporné hodnoty zaokrouhlené na nulu formátovány podle prvního formátovacího řetězce.
Kód:
SELECT FORMAT(0.1, '0 (Positive or Zero); 0 (Negative)') Positive, FORMAT(-0.1, '0 (Positive or Zero); 0 (Negative)') Negative;
Výsledek:
+----------------------+----------------------+ | Positive | Negative | |----------------------+----------------------| | 0 (Positive or Zero) | 0 (Positive or Zero) | +----------------------+----------------------+
Příklad 5 – Tři sekce (základní použití)
Zde je základní příklad zadání tří sekcí. K tomu používáme dva oddělovače sekcí.
Kód:
SELECT FORMAT(123, '0 (Positive); 0 (Negative); 0 (Zero)') Result;
Výsledek:
+----------------+ | Result | |----------------| | 123 (Positive) | +----------------+
V tomto případě bylo číslo kladnou hodnotou, takže bylo naformátováno podle první sekce.
Příklad 6 – Tři sekce (stejný formátový řetězec, různé hodnoty)
Tento příklad ukazuje různé výsledky, které bychom mohli získat z předchozího příkladu v závislosti na vstupní hodnotě.
Zde je stejný formátovací řetězec aplikován na různé hodnoty. Formátovací řetězec také přiřazuji proměnné, ale to jen pro usnadnění čtení.
DECLARE @formatstring varchar(35); SET @formatstring = '0 (Positive); 0 (Negative); 0 (Zero)'; SELECT FORMAT(123, @formatstring) 'Positive', FORMAT(-123, @formatstring) 'Negative', FORMAT(0, @formatstring) 'Zero', FORMAT(0.123, @formatstring) 'Rounded to Zero';
Výsledek:
+----------------+-----------------+----------+-------------------+ | Positive | Negative | Zero | Rounded to Zero | |----------------+-----------------+----------+-------------------| | 123 (Positive) | 123 (Negative) | 0 (Zero | 0 (Zero | +----------------+-----------------+----------+-------------------+
Příklad 7 – Tři sekce (včetně prázdného)
Pokud ponecháte druhý formátovací řetězec prázdný, použije se první část pro všechny nenulové hodnoty. Chcete-li pole ponechat prázdné, mezi středníky nenechávejte nic.
Kód:
SELECT FORMAT(123, '0 (Nonzero);; 0 (Zero)') 'Positive', FORMAT(-123, '0 (Nonzero);; 0 (Zero)') 'Negative', FORMAT(0, '0 (Nonzero);; 0 (Zero)') 'Zero', FORMAT(0.123, '0 (Nonzero);; 0 (Zero)') 'Rounded to Zero';
Výsledek:
+---------------+----------------+-----------+-------------------+ | Positive | Negative | Zero | Rounded to Zero | |---------------+----------------+-----------+-------------------| | 123 (Nonzero) | -123 (Nonzero) | 0 (Zero) | 0 (Zero) | +---------------+----------------+-----------+-------------------+
Je zajímavé, že v tomto případě je znaménko mínus pro zápornou hodnotu ponecháno nedotčené.
Příklad 8 – znaménko mínus
Jak již bylo zmíněno, oddělovač oddílů ignoruje jakékoli dříve existující formátování spojené s číslem. To zahrnuje jakékoli znaménko mínus pro záporné hodnoty (ačkoli předchozí příklad se zdá být výjimkou).
Pokud chcete zahrnout znaménko minus, budete ho muset explicitně přidat do formátovacího řetězce. Příklad níže.
Kód:
SELECT FORMAT(-123, '0 (P); 0 (N); 0 (Z)') 'Without minus sign', FORMAT(-123, '0 (P); -0 (N); 0 (Z)') 'With minus sign';
Výsledek:
+----------------------+-------------------+ | Without minus sign | With minus sign | |----------------------+-------------------| | 123 (N) | -123 (N) | +----------------------+-------------------+
Jak bylo uvedeno, předchozí příklad se zdá být výjimkou, takže je třeba mít na paměti. Co se stane, když do formátovacího řetězce pro zápornou hodnotu v předchozím příkladu přidám znaménko mínus:
SELECT FORMAT(-123, '-0 (Nonzero);; 0 (Zero)') Result;
Výsledek:
+-----------------+ | Result | |-----------------| | --123 (Nonzero) | +-----------------+