SQL - выбор части строки - PullRequest
       6

SQL - выбор части строки

2 голосов
/ 26 февраля 2010

Если у меня есть простая таблица, где данные таковы, что строки содержат строки вроде:

/abc/123/gyh/tgf/345/6yh/5er

В SQL, как я могу выбрать данные между 5-м и 6-м слешем? Каждая строка, которую я имею, представляет собой просто данные внутри передней косой черты, и я хочу выбрать только все символы от косой черты 5 до 6.

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

Функции CLR более эффективны при обработке строк, чем T-SQL. Вот некоторая информация, с которой можно начать писать пользовательскую функцию CLR.

Я думаю, вы должны создать функцию, которая имеет 3 параметра:

  1. значение, которое вы ищете
  2. разделитель (в вашем случае: /)
  3. Экземпляр, который вы ищете (в вашем случае: 5)

Затем вы разделяете разделитель (на массив). Затем верните 5-й элемент в массиве (индекс 4)


Вот решение t-sql, но я действительно считаю, что решение CLR было бы лучше.

DECLARE @RRR varchar(500)
SELECT @RRR = '/abc/123/gyh/tgf/345/6yh/5er'


DECLARE
    @index INT,
    @INSTANCES INT

SELECT
    @index = 1,
    @INSTANCES = 5

WHILE (@INSTANCES > 1) BEGIN
    SELECT @index = CHARINDEX('/', @RRR, @index + 1)
    SET @INSTANCES = @INSTANCES - 1
END

SELECT SUBSTRING(@RRR, @index + 1, CHARINDEX('/', @RRR, @index + 1) - @index - 1)
1 голос
/ 26 февраля 2010
SELECT SUBSTRING(myfield,

  /* 5-th slash */
  CHARINDEX('/', myfield,
    CHARINDEX('/', myfield,
      CHARINDEX('/', myfield,
        CHARINDEX('/', myfield,
          CHARINDEX('/', myfield) + 1) + 1) + 1) + 1)
  + 1,

  /* 6-th slash */          
  CHARINDEX('/', myfield,
    CHARINDEX('/', myfield,
      CHARINDEX('/', myfield,
        CHARINDEX('/', myfield,
          CHARINDEX('/', myfield,
            CHARINDEX('/', myfield) + 1) + 1) + 1) + 1) + 1)
  -
  /* 5-th slash again */
  CHARINDEX('/', myfield,
    CHARINDEX('/', myfield,
      CHARINDEX('/', myfield,
        CHARINDEX('/', myfield,
          CHARINDEX('/', myfield) + 1) + 1) + 1) + 1)
  - 1)

FROM myTable
WHERE ...

Это будет работать, но это далеко не элегантно. Если возможно, выберите полное поле и отфильтруйте требуемое значение на стороне клиента (используя более мощный язык программирования, чем T-SQL). Как видите, T-SQL не был предназначен для такого рода вещей.

(Изменить: я знаю, что следующее не относится к вашей ситуации, но я буду держать это как совет для тех, кто читает это:)

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

0 голосов
/ 26 февраля 2010

Может быть ... SELECT FROM `table` WHERE `field` LIKE '%/345/%'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...