V SQL RPAD()
se používá k doplnění pravé části řetězce zadaným znakem. Funkci lze použít pro řetězce a čísla, i když v závislosti na DBMS může být nutné předat čísla jako řetězec, než je lze doplnit.
DBMS, které mají RPAD()
funkce zahrnují MySQL, MariaDB, PostgreSQL a Oracle.
DBMS, které nedělají mít RPAD()
funkce zahrnují SQL Server a SQLite.
Příklad
Zde je příklad demonstrující RPAD()
funkce:
SELECT RPAD('Look Right', 40);
Výsledek:
+------------------------------------------+ | RPAD('Look Right', 40) | +------------------------------------------+ | Look Right | +------------------------------------------+
Zde je pravá část řetězce doplněna mezerou (výchozí znak výplně) a výsledný řetězec je dlouhý 40 znaků (protože jsem zadal 40
jako druhý argument).
Oracle funguje stejně, ale musíme použít FROM DUAL
když děláte dotaz, jako je tento (bez dotazu na skutečnou tabulku):
SELECT RPAD('Look Right', 40)
FROM DUAL;
Výsledek:
RPAD('LOOKRIGHT',40) ___________________________________________ Look Right
Ve výše uvedených příkladech jsem použil hodně vycpávek, aby bylo patrné.
Zde je další příklad, který může jasněji demonstrovat správné odsazení:
SELECT CONCAT(RPAD('abc', 4), 'def');
Výsledek:
abc def
V tomto případě jsem zřetězil abc
s def
ale abc
měl aplikovaný pravý výplň pomocí RPAD()
funkce.
Určení znaku výplně
Polstrování nemusí být nutně prostorem. Volitelně můžeme přidat třetí argument, který specifikuje znak (nebo znaky), který se má použít ve výplňovém poli.
SELECT RPAD('Rat', 4, 't');
Výsledek:
Ratt
Lze jej také použít k úpravě čísel padů s nulami (nebo jinou číslicí):
SELECT RPAD('7', 3, '0');
Výsledek:
700
To samozřejmě změní číslo a v tomto případě by toho bylo možné dosáhnout jednoduše vynásobením čísla 100. Vynásobením čísla se však ve skutečnosti neaplikuje výplň.
Následující příklad ukazuje, co tím myslím:
SELECT RPAD('77', 3, '0');
Výsledek:
770
Vynásobení 77 číslem 100 by mělo špatný výsledek.
Ve výše uvedených příkladech jsem předal číslo jako řetězec.
V některých systémech DBMS (jako je MariaDB a MySQL) můžeme číslo předat jako číslo a také jako číslo, kterým jej doplníme:
SELECT RPAD(7, 3, 0);
Výsledek:
700
Můžeme to udělat také v Oracle:
SELECT RPAD(7, 3, 0)
FROM DUAL;
Výsledek:
700
Ale PostgreSQL má s tímto problém:
SELECT RPAD(7, 3, 0);
Výsledek:
ERROR: function rpad(integer, integer, integer) does not exist
SQL Server
SQL Server nemá RPAD()
funkce, ale to nás nezastaví v přidávání odsazení k číslům a řetězcům.
Čísla
Pokud má číslo zlomkovou část, FORMAT()
funkce bude stačit:
SELECT
FORMAT(0.7, '.000') AS "1",
FORMAT(0.7, '0.00') AS "2",
FORMAT(7.0, '0.00') AS "3";
Výsledek:
+------+------+------+ | 1 | 2 | 3 | |------+------+------| | .700 | 0.70 | 7.00 | +------+------+------+
Funguje to tak, že předáme číslo a za ním formátovací řetězec. Ve výše uvedeném příkladu se formátovací řetězec skládá z vlastních číselných specifikátorů formátu, což vede k tomu, že původní číslo má k jeho zlomkové části přidané číslice. Pokud v původním čísle již není tolik číslic, je doplněno nulami.
Ale pokud číslo nemá zlomkovou část, pak můžeme použít REPLACE()
funkce k odstranění desetinného oddělovače, který je použit s FORMAT()
funkce:
SELECT
REPLACE(FORMAT(7, '.00', 'en-US'), '.', '') AS "1",
REPLACE(FORMAT(17, '.00', 'en-US'), '.', '') AS "2",
REPLACE(FORMAT(73.5, '.00', 'en-US'), '.', '') AS "3";
Výsledek:
+-----+------+------+ | 1 | 2 | 3 | |-----+------+------| | 700 | 1700 | 7350 | +-----+------+------+
Tuto metodu lze v případě potřeby také použít k přidání úvodních nul. Jednoduše je přidejte nalevo od desetinné čárky ve formátovacím řetězci.
Zde jsem explicitně použil en-US
jako (volitelný) třetí argument, který zajišťuje, že oddělovač desetinných míst je tečka/tečka, což je konvence používaná v en-US
národní prostředí.
Text
Zde je technika, kterou lze použít na textová data:
SELECT
LEFT('Dog' + '.........', 9) AS "1",
LEFT('Horse' + '.........', 9) AS "2",
LEFT('Crocodile' + '.........', 9) AS "3";
Výsledek:
+-----------+-----------+-----------+ | 1 | 2 | 3 | |-----------+-----------+-----------| | Dog...... | Horse.... | Crocodile | +-----------+-----------+-----------+
I když budete muset dávat pozor, abyste omylem neuřízli část provázku nebo nepřidali nechtěné mezery.