2015-12-20 2 views
3

У меня есть столбец long_name. Мне нужно получить короткое имя для этого столбца. Сокращенное имя состоит из первого символа после «_» в длинном имени.String Matching Pattern в postgresql

Например: значение параметра long_name: '_Michael_Smith' должно привести к 'MS' short_name значение параметра long_name: '_Michael_John_Smith' должно привести к SHORT_NAME 'MJS'

можно получить первый символ с помощью: подстроку (значение параметра long_name из position ('_' в long_name) +1 для 1) как short_name.

Как я могу получить оставшиеся символы в запросе?

+0

По соображениям производительности вам, вероятно, следует просто добавить новый столбец и определить краткое имя программным путем. Это подразумевает синхронизацию значений между двумя столбцами, но запросы, вероятно, будут выполняться намного быстрее. Другая возможность - определить значение программно «на ходу» на основе результатов запроса. Если вы решили использовать только один столбец и вам нужно короткое имя в результатах запроса, вы можете попробовать использовать regexp_replace: http://www.postgresql.org/docs/current/static/functions-matching.html –

ответ

1

Использование regexp_replace():

with example(long_name) as (
    values 
     ('_Michael_Smith'), 
     ('_Michael_John_Smith') 
    ) 
select 
    long_name, 
    regexp_replace(long_name, '_(.)[^_]+', '\1', 'g') short_name 
from example; 

     long_name  | short_name 
---------------------+------------ 
_Michael_Smith  | MS 
_Michael_John_Smith | MJS 
(2 rows) 

чтения: POSIX Regular Expressions.

+0

As разъяснение: это заменяет полное совпадение '_ (.) [^ _] +' с первой группой захвата '(.)' – Andomar