Быстрый вопрос SQL - PullRequest
       10

Быстрый вопрос SQL

0 голосов
/ 14 сентября 2011

Работа с Postgres SQL.

У меня есть таблица со столбцом, который содержит значения следующего формата:

Set1 / Set2 / Set3 /...

Сети могут быть набором значений для каждого i.Они ограничены символом '/'.

. Я хотел бы показать отдельные записи вида set1 / set2, а именно - я хотел бы обрезать или обрезать оставшуюся часть строки в этих записях.То есть мне нужны все различные параметры для:

Set1 / Set2

Было бы прекрасно работать с регулярным выражением: я хочу подстроку шаблона:. * /. * /

должен отображаться без остатка.

Я дошел до:

выбрать отличное имя столбца из имени таблицы

, но у меня нетИдея, как сделать обрезку самостоятельно.

Пробовал искать в w3schools и других сайтах, а также искать SQL-усечение / усечение SQL в Google, но не нашел то, что я ищу.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

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

Например:

=> select substring('Set1/Set2/Set3/' from '^[^/]+/[^/]+');
 substring 
-----------
 Set1/Set2
(1 row)

=> select substring('Set123/Set24/Set3/' from '^[^/]+/[^/]+');
  substring   
--------------
 Set123/Set24
(1 row)

Таким образом, ваш запрос к таблице будет выглядеть так:

select distinct substring(column_name from '^[^/]+/[^/]+') from table_name;

Соответствующие документы: http://www.postgresql.org/docs/8.4/static/functions-string.html и http://www.postgresql.org/docs/8.4/static/functions-matching.html.

2 голосов
/ 14 сентября 2011

Почему вы храните несколько значений в одной записи?Предпочтительным решением будет использование нескольких значений в нескольких записях, ваша проблема больше не будет существовать.

Другой вариант - использование массива значений с использованием TEXT [] array-datatype вместо текста.Вы можете индексировать поле массива, используя GIN-index .

SUBSTRING () (как показал mu_is_too_short) может решить текущую проблему, используя массив и функции array - это другой вариант:

SELECT array_to_string ((string_to_array ('Set1 / Set2 / Set3 /', '/')) [1: 2], '/');

Это делает его довольно гибким, нет необходимости в фиксированной длине значений.Разделитель в функциях массива сделает работу.[1: 2] выберет первые 2 среза массива, а [1: 3] выберет срезы 1–3. Это облегчает изменение.

1 голос
/ 14 сентября 2011

Если они действительно такие регулярные, вы можете использовать substring; например:

=> select substring('Set1/Set2/Set3/' from 1 for 9);
 substring 
-----------
 Set1/Set2
(1 row)

Существует также версия substring, которая понимает регулярные выражения POSIX, если вам нужно немного больше гибкости.

Онлайн-документация PostgreSQL довольно неплоха:

http://www.postgresql.org/docs/current/static/index.html

и даже имеет полезный индекс и разумную навигацию.


Если вы хотите использовать .*/.*, вам нужно что-то вроде substring(s from '[^/]+/[^/]+'), например:

=> select substring('where/is/pancakes/house?' from '[^/]+/[^/]+');
 substring 
-----------
 where/is
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...