2015-08-09 2 views
-1

У меня есть таблица, содержащая столбец с буквенно-цифровыми значениями, которые хранятся в виде строки. У меня есть несколько значений в этом столбце, имеющие значения, такие как F4737, 00Y778, PP0098, XXYYYZ т.д.Извлечь буквенно-цифровое значение из столбца varchar

Хочу значений экстракта, начиная с серии F и должны иметь числовые значения в этой строке. Буквенно-цифровая колонка - уникальный столбец, имеющий уникальные значения, но остальные столбцы содержат повторяющиеся значения в моей таблице.

Futhermore, когда эти значения извлекается я хотел бы, чтобы подобрать значение макс из дубликата строки, для например:

Пусть у меня есть F4737 и F4700 как уникальный алфавитно-цифровая строка, то F4737 сусла быть извлеченным из него.

Я написал запрос, как это, но числовые значения не получают извлеченный из этого запроса:

select max(Alplanumeric) 
from Customers 
where Alplanumeric '%[F0-9]% 

или

select max(Alplanumeric) 
from Customers 
where Alplanumeric like '%[0-9]%' 
and Alplanumeric like 'F%'** 

я запускаю приведенный выше запрос, но я только получение F, если я удаляю числовую часть из вышеуказанного запроса. Как извлечь как стартовую серию F, так и числовые значения, включенные в эту строку?

+0

Если вы хотите выполнять такие операции, то вы должны сохранить значения в таблице соединений с одной строкой на одного клиента и одной строкой на каждый код. –

+0

'LIKE' не поддерживает регулярные выражения.Вам нужно использовать 'похожее',' ~ 'operator или' regexp_matches() '. Подробнее см. В руководстве: http://www.postgresql.org/docs/current/static/functions-matching.html –

+0

Я не хочу отделять значения в таблице переходов или использовать совпадения регулярных выражений, поскольку это увеличило выполнение запроса , Я попробовал этот запрос: выберите max (CustomerName) от Клиентов, где CustomerName, например «% 4%» и CustomerName, например «F%», этот работает, но только для числового значения 4. Я хотел бы добавить и другие числовые значения в этом запросе , – user1538020

ответ

0

Выходя на конечности, вы могли бы искать для запроса, как это:

SELECT *, substring(alphanumeric, '^F(\d+)')::int AS nr 
FROM customers 
WHERE alphanumeric ~ '^F\d+' 
ORDER BY nr DESC NULLS LAST 
     , alphanumeric 
LIMIT 1; 

The WHERE условия является регулярное выражение, выражение привязывается к началу, поэтому он может использовать индекс , В идеале:

CREATE INDEX customers_alphanumeric_pattern_ops_idx ON customers 
(alphanumeric text_pattern_ops); 

Это возвращает одну строку с наивысшим (извлеченной) числовое значение в alphanumeric среди строк, начинающихся с «F» с последующим одним или более цифр.

О индекс:

О сопоставлении с образцом:


В идеале вы должны сохранить ведущий текст и следующее числовое значение в отдельные столбцы, чтобы сделать это более эффективным. Вам не обязательно нужно больше таблиц, как было предложено.