Бывают ситуации, когда нужно получить строку определенной длины. Например, мы хотим показать последние четыре цифры номера телефона, заменив остальные цифры звездочками.
Плохое решение
Попробуем на примере:
SELECT *
FROM contact
| # | phone |
|---|---|
| 1 | 1234567890 |
| 2 | 123456 |
Получим последние 4 цифры и длину номера телефона:
SELECT right (phone, 4) AS rest,
length (phone)
FROM contact
| # | rest | length |
|---|---|---|
| 1 | 7890 | 10 |
| 2 | 3456 | 6 |
Дальше можно взять большую строку, функцией substr получить из нее необходимое количество звездочек. В конце к полученной строке звездочек добавить последние 4 цифры. Ну как-то так:
SELECT substr('*************************', 1, length (phone) - 4) || right (phone, 4) AS mask
FROM contact
| # | mask |
|---|---|
| 1 | ******7890 |
| 2 | **3456 |
Задача решена. Но решение очень сложное. Если не знать, какая задача решалась, то с выражением
substr('*************************', 1, length (phone) - 4) || right (phone, 4)
можно достаточно долго разбираться.
Функции lpad и rpad
В SQL есть две функции, дополняющих строку до определенной длины.
lpad(строка, до_какой_длины, какими_символами)
Дополняет строку слева до длины переданными в третьем параметре символами.
SELECT lpad('123', 5, '*')
| # | lpad |
|---|---|
| 1 | **123 |
Если третий параметр не передан, то строка дополняется пробелами.
SELECT lpad('123', 5)
| # | lpad |
|---|---|
| 1 | 123 |
Если длина строки уже больше заданной, она обрезается справа.
SELECT lpad('12345', 2)
| # | lpad |
|---|---|
| 1 | 12 |
rpad(строка, до_какой_длины, какими_символами)
Дополняет строку справа до длины переданными в третьем параметре символами.
SELECT rpad('123', 5, '*')
| # | rpad |
|---|---|
| 1 | 123** |
Если третий параметр не передан, то строка дополняется пробелами.
| # | rpad |
|---|---|
| 1 | 123 |
Если длина строки уже больше заданной, она обрезается справа.
SELECT rpad('12345', 2)
| # | rpad |
|---|---|
| 1 | 12 |
Хорошее решение
С учетом новых знаний задачу с номерами телефонов можно решить так:
SELECT lpad (right(phone, 4), length(phone), '*') AS mask
FROM contact
| # | mask |
|---|---|
| 1 | ******7890 |
| 2 | **3456 |