В SQL, RPAD()
се използва за допълване на дясната част на низ с определен символ. Функцията може да се използва за низове и числа, въпреки че в зависимост от СУБД, може да се наложи числата да се предават като низ, преди да могат да бъдат допълнени.
СУБД, които имат RPAD()
функция включва MySQL, MariaDB, PostgreSQL и Oracle.
СУБД, които не имат RPAD()
функция включва SQL Server и SQLite.
Пример
Ето пример за демонстриране на RPAD()
функция:
SELECT RPAD('Look Right', 40);
Резултат:
+------------------------------------------+ | RPAD('Look Right', 40) | +------------------------------------------+ | Look Right | +------------------------------------------+
Тук дясната част на низа е допълнена с интервал (знакът за допълване по подразбиране) и полученият низ е дълъг 40 знака (защото посочих 40
като втория аргумент).
Oracle работи по същия начин, но трябва да използваме FROM DUAL
когато правите заявка като тази (без заявка към действителна таблица):
SELECT RPAD('Look Right', 40)
FROM DUAL;
Резултат:
RPAD('LOOKRIGHT',40) ___________________________________________ Look Right
В горните примери използвах много подплънки, за да направя подплатата очевидна.
Ето още един пример, който може да демонстрира по-ясно правилното подреждане:
SELECT CONCAT(RPAD('abc', 4), 'def');
Резултат:
abc def
В този случай свързах abc
с def
но abc
имаше дясно запълване, приложено с RPAD()
функция.
Посочете символ за подреждане
Подпълването не е задължително да е място. Можем по избор да добавим трети аргумент, за да посочим знака (или знаците), които да използваме в запълването.
SELECT RPAD('Rat', 4, 't');
Резултат:
Ratt
Може да се използва и за десни числа с нули (или друга цифра):
SELECT RPAD('7', 3, '0');
Резултат:
700
Това очевидно променя числото и в този случай същото би могло да се постигне просто чрез умножаване на числото по 100. Умножаването на число обаче всъщност не прилага допълване към него.
Следният пример показва какво имам предвид:
SELECT RPAD('77', 3, '0');
Резултат:
770
Умножаването на 77 по 100 би довело до грешен резултат.
В горните примери предадох числото като низ.
В някои СУБД (като MariaDB и MySQL) можем да предадем числото като число, както и числото, с което да го добавим:
SELECT RPAD(7, 3, 0);
Резултат:
700
Можем да направим това и в Oracle:
SELECT RPAD(7, 3, 0)
FROM DUAL;
Резултат:
700
Но PostgreSQL има проблем с това:
SELECT RPAD(7, 3, 0);
Резултат:
ERROR: function rpad(integer, integer, integer) does not exist
SQL сървър
SQL Server няма RPAD()
функция, но това не ни пречи да добавяме допълване към числа и низове.
Числа
Ако числото има дробна част, FORMAT()
функция ще бъде достатъчна:
SELECT
FORMAT(0.7, '.000') AS "1",
FORMAT(0.7, '0.00') AS "2",
FORMAT(7.0, '0.00') AS "3";
Резултат:
+------+------+------+ | 1 | 2 | 3 | |------+------+------| | .700 | 0.70 | 7.00 | +------+------+------+
Начинът, по който работи е, че предаваме числото, последвано от форматиращ низ. В горния пример низът за формат се състои от персонализирани спецификатори на числов формат, което води до оригиналното число с цифри, добавени към неговата дробна част. Ако вече няма толкова много цифри в оригиналното число, тогава то е подплатено с нули.
Но ако числото няма дробна част, тогава можем да използваме REPLACE()
функция за премахване на десетичния разделител, който е приложен с FORMAT()
функция:
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";
Резултат:
+-----+------+------+ | 1 | 2 | 3 | |-----+------+------| | 700 | 1700 | 7350 | +-----+------+------+
Този метод може да се използва и за добавяне на водещи нули, ако е необходимо. Просто ги добавете вляво от десетичната запетая във форматиращия низ.
Тук изрично използвах en-US
като (по избор) трети аргумент, за да се гарантира, че десетичният разделител е точка/точка, което е конвенцията, използвана от en-US
локал.
Текст
Ето техника, която може да се използва върху текстови данни:
SELECT
LEFT('Dog' + '.........', 9) AS "1",
LEFT('Horse' + '.........', 9) AS "2",
LEFT('Crocodile' + '.........', 9) AS "3";
Резултат:
+-----------+-----------+-----------+ | 1 | 2 | 3 | |-----------+-----------+-----------| | Dog...... | Horse.... | Crocodile | +-----------+-----------+-----------+
Въпреки че ще трябва да внимавате да не отрежете случайно част от низа или да добавите нежелани интервали.