2015-03-03 1 views
-1

У меня есть таблица продуктов и имеет значения для пути категории как «2210> 2215> 2219» и так далее. Где 2210, 2215, 2219 являются идентификаторами категории из таблицы категорий.Разделить запрос SQL-сервера на>

Немногие категории неактивны в базе данных, которая поддерживается в таблице категорий.

Чтобы найти продукты с неактивной категорией в категории path, я хочу написать запрос.

Я хотел бы сделать что-то вроде этого:

select p.* from product p, category c 
where c.categoryId in (split(p.categoryPath,'>')); 

, которая должна в основном, разделить путь категории по «>» и вернуть мне несколько строк, которые передаются в «в». Есть ли способ, по которому я могу разделить это и получить отдельные строки, которые должны быть переданы в разделе для вышеприведенного запроса?

+2

Вы забыли задать вопрос! –

+1

Не хранить данные, как это правильное решение. Хранить отношения, а не пути. (SQL предназначен для отношений ...) – jarlh

+0

@CoderofCode ... lol, функция split не доступна в sql-сервере, поэтому я ищу его. – HarsH1610

ответ

1

Попробуйте

создать функцию

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20)) 
RETURNS @Strings TABLE 
( 
    position int IDENTITY PRIMARY KEY, 
    value varchar(8000) 
) 
AS 
BEGIN 

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
    BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
     BEGIN 
     INSERT INTO @Strings VALUES (@text) 
      BREAK 
     END 
    IF (@index > 1) 
     BEGIN 
     INSERT INTO @Strings VALUES (LEFT(@text, @index - 1)) 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
     END 
    ELSE 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END 
    RETURN 
END 

Sql запрос будет

select p.* from product p, category c 
where c.categoryId in (select value from fn_split(p.categoryPath,'>')); 
Смежные вопросы