#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. Я хочу наверняка проголосовать за этот ответ тысячу раз