2010-02-25 4 views
2

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

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

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

+0

Эта база данных вы используете? – Jeff

+0

SQL Server 2005 – Ode

+0

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

ответ

2

Функции 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) 
0

Maybe ... SELECT FROM `table` WHERE `field` LIKE '%/345/%'

+0

Это будет выбор набора, содержащего 345, но он хочет разобрать данные, я думаю. –

+0

Да, это не сработает, потому что это не всегда будет 345. Я хотел бы получить что-нибудь между 5-м и 6-м слэшем, независимо от того, что там. – Ode

+0

Итак, выберите LIKE '/% /% /% /% /% /% /%' и используйте сценарии на стороне сервера, чтобы разделить его? XD – casraf

1
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 не был предназначен для такого рода вещей.

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

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

Смежные вопросы