Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zastosować formatowanie warunkowe do liczby w programie SQL Server za pomocą FORMAT()

Być może jedna z mniej znanych funkcji FORMAT() Funkcja w SQL Server to taka, która umożliwia zastosowanie formatowania warunkowego do liczby.

Jest to bardziej funkcja platformy .NET niż funkcja SQL Server (lub T-SQL), ale SQL Server/T-SQL obsługuje ją tak samo, umożliwiając pełne wykorzystanie możliwości stosowania formatowania warunkowego do liczb.

Wszystko sprowadza się do ciągu formatu, który przekazujesz do FORMAT() funkcjonować.

Możesz przekazać ciąg formatujący, który określa sposób formatowania liczby, w zależności od tego, czy jest dodatnia, ujemna czy zerowa.

Żeby było jasne, nie mówię o formatowaniu liczby za pomocą kolorów lub czcionek itp. Mówię wyłącznie o formatowaniu liczb, którego normalnie używałbyś FORMAT() funkcja dla (np. dodawanie separatorów tysięcy, znaków procentowych, przecinków dziesiętnych itp.).

Ponadto to formatowanie warunkowe jest dość ograniczone — można przetestować tylko trzy warunki (dodatni, ujemny lub zerowy). Jednak w razie potrzeby możesz również zastosować to samo formatowanie do dwóch warunków jednocześnie.

W każdym razie, oto jak użyć FORMAT() funkcja do zastosowania formatowania warunkowego do liczby w SQL Server.

Przedstawiamy ; – Separator sekcji

.NET definiuje średnik (; ) jako jeden z jego niestandardowych specyfikatorów formatu liczbowego, określany jako separator sekcji .

Separator sekcji to warunkowy specyfikator formatu, który definiuje sekcje z oddzielnymi ciągami formatu dla liczb dodatnich, ujemnych i zerowych. Pozwala to zastosować różne formatowanie do liczby w zależności od tego, czy jej wartość jest dodatnia, ujemna czy zerowa.

Niestandardowy ciąg formatu liczb może zawierać maksymalnie trzy sekcje oddzielone średnikami. Oto one:

  • Jedna sekcja :W tym przypadku nie stosuje się formatowania warunkowego. Ciąg formatu dotyczy wszystkich wartości. Nie jest potrzebny separator sekcji (ponieważ jest tylko jedna sekcja). Bez wątpienia jest to najczęstsza forma ciągu formatującego.
  • Dwie sekcje :Pierwsza sekcja dotyczy wartości dodatnich i zer, a druga sekcja dotyczy wartości ujemnych.

    Jeśli liczba do sformatowania jest ujemna, ale staje się zerem po zaokrągleniu zgodnie z formatem w drugiej sekcji, wynikowe zero jest formatowane zgodnie z pierwszą sekcją.

  • Trzy sekcje :Pierwsza sekcja dotyczy wartości dodatnich, druga sekcja dotyczy wartości ujemnych, a trzecia sekcja dotyczy zer.

    Druga sekcja może pozostać pusta (nie mając nic między średnikami), w którym to przypadku pierwsza sekcja dotyczy wszystkich wartości niezerowych.

    Jeśli liczba do sformatowania jest niezerowa, ale staje się zerem po zaokrągleniu zgodnie z formatem w pierwszej lub drugiej sekcji, wynikowe zero jest formatowane zgodnie z trzecią sekcją.

Zwróć uwagę, że wartości ujemne są zawsze wyświetlane bez znaku minusa, gdy używane są separatory sekcji (chociaż są wyjątki, jak zobaczysz później). Jeśli chcesz, aby końcowa sformatowana wartość miała znak minus, musisz jawnie dołączyć znak minus jako część niestandardowego ciągu formatu. Dotyczy to również każdego innego istniejącego formatowania związanego z numerem.

Przykład 1 – jedna sekcja (bez formatowania warunkowego)

Oto typowy ciąg formatu liczbowego składający się z jednej sekcji. Nie są używane żadne separatory sekcji, dlatego nie stosuje się formatowania warunkowego .

Kod:

SELECT 
  FORMAT(123, '0 (Number)') Positive,
  FORMAT(-123, '0 (Number)') Negative,
  FORMAT(0, '0 (Number)') Zero;

Wynik:

+--------------+---------------+------------+
| Positive     | Negative      | Zero       |
|--------------+---------------+------------|
| 123 (Number) | -123 (Number) | 0 (Number) |
+--------------+---------------+------------+

Zauważ, że znak minus pozostaje nienaruszony. Zostałoby to usunięte, gdybyśmy użyli separatorów sekcji.

Przykład 2 – Dwie sekcje (formatowanie warunkowe)

Tutaj zaczyna się formatowanie warunkowe.

W tym przykładzie mamy dwie sekcje (oddzielone jednym separatorem sekcji). Sekcja po lewej stronie separatora dotyczy tylko wartości dodatnich lub zerowych. Sekcja po prawej dotyczy tylko wartości ujemnych.

Kod:

SELECT FORMAT(123,  '0 (Positive or Zero); 0 (Negative)') Result;

Wynik:

+------------------------+
| Result                 |
|------------------------|
| 123 (Positive or Zero) |
+------------------------+

W tym przypadku liczba była dodatnia, więc do jej sformatowania użyto pierwszej sekcji.

Przykład 3 – Dwie sekcje (ten sam ciąg formatu, różne wartości)

W następnym przykładzie ten sam ciąg formatu jest stosowany do różnych wartości (dodatnich, ujemnych i zerowych).

Kod:

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;

Wynik:

+------------------------+-----------------+----------------------+
| Positive               | Negative        | Zero                 |
|------------------------+-----------------+----------------------|
| 123 (Positive or Zero) |  123 (Negative) | 0 (Positive or Zero) |
+------------------------+-----------------+----------------------+

Tak więc ten przykład pokazuje prawdziwą zaletę separatorów sekcji — możemy uzyskać różne wyniki w zależności od wartości.

Przykład 4 – Dwie sekcje z zaokrągleniem

W przypadku korzystania z dwóch sekcji wszelkie wartości ujemne, które są zaokrąglane do zera, są formatowane pod pierwszym ciągiem formatu.

Kod:

SELECT 
  FORMAT(0.1,  '0 (Positive or Zero); 0 (Negative)') Positive,
  FORMAT(-0.1, '0 (Positive or Zero); 0 (Negative)') Negative;

Wynik:

+----------------------+----------------------+
| Positive             | Negative             |
|----------------------+----------------------|
| 0 (Positive or Zero) | 0 (Positive or Zero) |
+----------------------+----------------------+

Przykład 5 – Trzy sekcje (podstawowe zastosowanie)

Oto podstawowy przykład określenia trzech sekcji. Aby to osiągnąć, używamy dwóch separatorów sekcji.

Kod:

SELECT FORMAT(123, '0 (Positive); 0 (Negative); 0 (Zero)') Result;

Wynik:

+----------------+
| Result         |
|----------------|
| 123 (Positive) |
+----------------+

W tym przypadku liczba była wartością dodatnią, więc została sformatowana w pierwszej sekcji.

Przykład 6 – Trzy sekcje (ten sam ciąg formatu, różne wartości)

Ten przykład pokazuje różne wyniki, które mogliśmy uzyskać z poprzedniego przykładu, w zależności od wartości wejściowej.

Tutaj ten sam ciąg formatu jest stosowany do różnych wartości. Przypisuję również ciąg formatujący do zmiennej, ale to tylko po to, aby ułatwić czytanie.

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';

Wynik:

+----------------+-----------------+----------+-------------------+
| Positive       | Negative        | Zero     | Rounded to Zero   |
|----------------+-----------------+----------+-------------------|
| 123 (Positive) |  123 (Negative) |  0 (Zero |  0 (Zero          |
+----------------+-----------------+----------+-------------------+

Przykład 7 – Trzy sekcje (w tym pusta)

Jeśli drugi ciąg formatujący pozostanie pusty, pierwsza sekcja dotyczy wszystkich wartości niezerowych. Aby pozostawić puste, po prostu nie zostawiaj nic między średnikami.

Kod:

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';

Wynik:

+---------------+----------------+-----------+-------------------+
| Positive      | Negative       | Zero      | Rounded to Zero   |
|---------------+----------------+-----------+-------------------|
| 123 (Nonzero) | -123 (Nonzero) |  0 (Zero) |  0 (Zero)         |
+---------------+----------------+-----------+-------------------+

Co ciekawe, w tym przypadku znak minus dla wartości ujemnej pozostaje nienaruszony.

Przykład 8 – Znak minus

Jak wspomniano, separator sekcji ignoruje wszelkie istniejące wcześniej formatowanie związane z liczbą. Obejmuje to dowolny znak minus dla wartości ujemnych (chociaż poprzedni przykład wydaje się być wyjątkiem od tego).

Jeśli chcesz dołączyć znak minus, musisz wyraźnie dodać go do ciągu formatu. Przykład poniżej.

Kod:

SELECT 
  FORMAT(-123, '0 (P); 0 (N); 0 (Z)') 'Without minus sign',
  FORMAT(-123, '0 (P); -0 (N); 0 (Z)') 'With minus sign';

Wynik:

+----------------------+-------------------+
| Without minus sign   | With minus sign   |
|----------------------+-------------------|
|  123 (N)             |  -123 (N)         |
+----------------------+-------------------+

Jak wskazano, poprzedni przykład wydaje się być wyjątkiem od tej reguły, więc o czym należy pamiętać. Oto, co się stanie, jeśli dodam znak minus do ciągu formatującego dla wartości ujemnej w poprzednim przykładzie:

SELECT FORMAT(-123,  '-0 (Nonzero);; 0 (Zero)') Result;

Wynik:

+-----------------+
| Result          |
|-----------------|
| --123 (Nonzero) |
+-----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przełączanie partycji w SQL Server (T-SQL)

  2. Jak zmienić bieżący format daty w SQL Server (T-SQL)

  3. Przekazywanie parametru ciągu xml do procedury składowanej SQL Server

  4. „Błąd krytyczny połączenia wewnętrznego” podczas wykonywania natywnie skompilowanej procedury przechowywanej w programie SQL Server 2019 (znany błąd)

  5. Warunkowa klauzula WHERE w SQL Server