У меня есть таблица в памяти внутри хранимой процедуры.Таблица никогда не будет больше 12 записей и основана на разборе строки.Значения добавляются ПОСЛЕ того, как происходит анализ, а значения НЕ загружаются на основе порядкового номера (и не могут быть).Столбец «тип» представляет тип данных, значения которых имеют следующие значения:
0 = primary
1 = secondary
2 = literal
И при его загрузке действуют следующие правила:
- a secondary only applies to the first primary with a lower ordinal.
- a literal will never exist between a primary and a secondary (within ordinal order)
Данные, которые мне нужны (в порядковом числе)порядок) первичный или литеральный, если первичный не равен NULL / пусто, затем первый NON нулевой / пустой вторичный до следующего первичного / литерального.
DECLARE @data TABLE (
[type] Integer,
[value] VarChar(200),
[ordinal] Integer,
family Integer -- added for answer
)
-- dummy data for test purposes
INSERT INTO @data
SELECT 0, '', 0, 0;
INSERT INTO @data
SELECT 1, 'sec1', 1, 0;
INSERT INTO @data
SELECT 1, 'sec2', 2, 0;
INSERT INTO @data
SELECT 2, '/', 3, 1;
INSERT INTO @data
SELECT 0, 's1', 4, 2;
INSERT INTO @data
SELECT 1, 'so', 5, 2;
INSERT INTO @data
SELECT 2, '-', 6, 3;
INSERT INTO @data
SELECT 1, 'p0', 7, 4;
-- done load of data
-- update data here to blank all the non needed records
DECLARE @output VarChar(1000)
SELECT @output = CASE
WHEN @output IS NULL THEN value
ELSE @output + value
END
FROM @data
WHERE value != ''
ORDER BY ordinal;
-- ideally @output should look like: "sec1/s1-p0"
Вывод, потому что первичный порядковый номер 0 пуст, ивторичный порядковый номер 1 не так использовать, и пропустите вторичный порядковый номер 2. буквальный порядковый номер 3. первичный порядковый номер 4 НЕ пуст, поэтому используйте его, пропустите вторичный порядковый номер 5. буквальный порядковый номер 6 и непустой первичный порядковый номер 7.
Iя пытаюсь НЕ использовать курсор здесь, если это возможно.
Хорошо, я понял это.Я добавил еще одно поле в таблицу для группировки первичных и вторичных данных.Тогда я просто получаю порядковый номер min () в группе, где значения НЕ были пустыми или NULL.Сделайте соединение обратно к основному столу, и теперь у меня есть требуемый ответ.
SELECT @output = CASE
WHEN @output IS NULL THEN value
ELSE @output + value
END
FROM @data p
INNER JOIN ( SELECT family, MIN( ordinal) As 'ordinal'
FROM @data WHERE ISNULL( value, '') != ''
GROUP BY family ) s ON p.ordinal = s.ordinal AND p.family = s.family
WHERE value != ''
ORDER BY ordinal;