Дополнение до определенной длины

Бывают ситуации, когда нужно получить строку определенной длины. Например, мы хотим показать последние четыре цифры номера телефона, заменив остальные цифры звездочками.

Плохое решение

Попробуем на примере:

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

7.5 POSITION - поиск подстроки

7.7 TRIM - удаление символов с начала и конца строки