Фильтрация дубликатов записей из временной таблицы из `regexp_split_to_table`

#postgresql

#postgresql

Вопрос:

У меня есть следующие данные таблицы.. Имя таблицы — категория

 | ID             | CATEGORY                     | 
 ---------------- -------------------------- 
| 1              | Apple,Orance-........... | 
| 2              | Apple,Grapes-........... | 
| 3              | Juice,Apple,Cucumber-... |
  

Я пытаюсь создать временную таблицу, анализируя значения, разделенные запятыми, как отдельные строки следующим образом

 | ID          | split_categori
 ------------- -------------------
| 1           | Apple
| 2           | Orange
| 3           | Grapes
| 4           | Juice
| 5           | Cucumber
  

Для этого я использую следующий код.

 SELECT CATEGORI.ID, regexp_split_to_table(CATEGORI.CATEGORY, E',') AS split_categori  FROM CATEGORI;
  

CATEGORI это имя таблицы. ID и CATEGORY являются именами столбцов

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

Как я могу отфильтровать эти повторяющиеся записи? Есть ли какие-либо способы сделать это с помощью запроса или я должен полагаться на ResultSet?

Комментарии:

1. Если у вас одинаковые категории для разных идентификаторов, какой идентификатор вы хотите выбрать? например, почему у вас 1, Apple, а не 2, Apple в ожидаемом результате?

2. Я просто хочу перечислить все разделенные запятыми значения из КАТЕГОРИИ в виде отдельных строк без каких-либо повторяющихся значений.

Ответ №1:

Поскольку вам, похоже, не важен идентификатор, который вы выбираете для повторяющихся категорий, вы можете использовать:

 select min(c.id) as id, t.name
from categori c
  cross join regexp_split_to_table(c.category, E',') AS t(name) 
group by t.name
order by 1;
  

Обратите внимание, что использование функции возврата набора в select списке не рекомендуется и ее больше не следует использовать, поэтому я перешел regexp_split_to_table() в from предложение.

Но regexp_split_to_table() является чрезвычайно медленной функцией и должна использоваться только в том случае, если вам действительно нужно разделить регулярное выражение. Использование string_to_array() было бы намного эффективнее:

 select min(c.id) as id, t.name
from categori c
  cross join unnest(string_to_array(c.category, ',')) AS t(name) 
group by t.name
order by 1
  

Вот работающий пример: http://rextester.com/YSHT62551

Комментарии:

1. ты гений, братан

2. Я хочу наверняка проголосовать за этот ответ тысячу раз