2014-01-14 2 views
0

Это запрос, я использую:Сортировка строк в исходном порядке

;WITH list (Value) AS 
(
SELECT Value 
     FROM (
     SELECT Value 
     FROM fn_SplitString('Quick Brown Fox',' ') 
     ) a 
), cte AS 
(
    SELECT Value 
    FROM list 
    UNION ALL 
    SELECT two.Value + ' ' + one.Value 
    FROM cte AS one, list AS two 
    WHERE two.Value > one.Value 
) 
SELECT * 
FROM cte 

выход этого будет

Quick 
Brown 
Fox 
Quick Fox 
Quick Brown 
Fox Brown 
Quick Fox Brown 

The fn_SplitString создаст таблицу, как это. Он просто разделит все слова, разделенные пробелами на строки.

Quick 
Brown 
Fox 

Я уже пытался задним ходом его помощью ROW_NUMBER() OVER(ORDER BY GETDATE()) и это будет выход fn_SplitString. Но все же общий результат будет таким же.

Fox 
Brown 
Quick 

запрос выше сортирует слова/буквы в алфавитном порядке (реверсивные) для каждой строки и какой выход я нужен не сортируется в алфавитном порядке или как в примере ниже.

Ожидаемый результат

Quick 
Brown 
Fox 
Quick Brown 
Quick Fox 
Brown Fox 
Quick Brown Fox 

или

Quick Brown Fox 
Quick Brown 
Quick Fox 
Brown Fox 
Quick 
Brown 
Fox 

как я буду это делать?

+0

Какое правило для 'C A B' находиться в этом конкретном порядке? – zerkms

+0

Первое слово будет первым, последнее слово будет последним. например: «быстрая коричневая лиса» ' быстро коричневый лиса шустрая коричневая лиса быстро лиса шустрая лиса ' –

+0

Мы должны видеть, как fn_SplitString выдает проанализированные данные. Он должен иметь возможность вернуть вам индекс, который вы можете использовать позже для сортировки –

ответ

0

Было бы лучше, либо модифицировать fn_SplitString вернуть индексатор или переключиться на использование другого разделения строковой функции, которая возвращает один (example), но в любом случае вам нужно получить индекс сортировки от этой операции синтаксического анализа ,

EDIT: Порядок вставки в @Stage ниже не является надежным без явного ORDER BY, как прокомментировал damien. Ill оставить пример здесь, но это не служит целям ОП-в:

declare @stage table (i int identity(1,1) primary key, value varchar(max)); 
insert into @stage (value) 
    select Value from dbo.fn_SplitString('Quick Brown Fox',' '); 

;WITH list (i, Value) AS 
(
    SELECT [i] = cast(i as varchar(10)), Value 
    FROM @stage 
), cte (i, value) AS 
(
    SELECT cast(i as varchar(10)), 
      Value 
    FROM list AS wan 
    UNION ALL 
    SELECT cast(two.i + '/' + one.i as varchar(10)), 
      two.Value + ' ' + one.Value 
    FROM cte AS one, list AS two 
    WHERE two.Value > one.Value 
) 
SELECT * 
FROM cte 
order by len(i), i; 

Здесь ив построил «я» как путь узла («1/2/3»), только чтобы показать, что происходит в вашем КТР , Вы можете, конечно, заказать это так, как хотите, используя i.

+0

Спасибо за ответ, я выполнил запрос, который вы создали, и выход Быстрый Brown Fox 1/2 \t Quick Brown 1/3 \t Быстрый Fox 3/2 \t Fox Brown 1/3/2 \t Быстрый Фокс Браун вы сказали мне, что я могу заказать его в любом случае я хочу, но как? не могли бы вы привести мне пример? Я хочу, чтобы последний выход был 1/2/3. Еще раз спасибо –

+1

'INSERT ... SELECT' гарантирует только присвоение идентификационных значений в« правильном »порядке, если вы используете предложение« ORDER BY ». Но для этого мы снова возвращаемся к необходимости использования функции split, чтобы дать нам столбец, который мы можем использовать для этой цели. –

+0

@Damien_The_Unbeliever точно в точности ... я собирался добавить, что это будет работать, только если fn_SplitString имеет явный порядок внутри него, но это невозможно. +1 –

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