Бывают ситуации, когда нужно получить строку определенной длины. Например, мы хотим показать последние четыре цифры номера телефона, заменив остальные цифры звездочками.
Плохое решение
Попробуем на примере:
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 |