Я ищу способ, внутри оператора TSQL SELECT
, повторить строковый литерал N раз, где N - целое число, которое я выбираю (или вычисляет) из столбцов таблицы.
В частности, я разбираю иерархическую древовидную структуру во вложенные неупорядоченные списки HTML. Итак, предположим, что мы очень глубоко в дереве, но следующая запись очень мелкая. Нам нужно закрыть кучу открытых тегов <ul>
и <li>
выше в дереве. Итак, то, что я сделал (но я чувствую себя слишком глупым):
select case Depth-Next_Depth
when -1 then ''
when 0 then ''
when 1 then '</ul></li>'
when 2 then '</ul></li></ul></li>'
when 3 then '</ul></li></ul></li></ul></li>'
...
end
from MyTable
Я знаю, что я мог бы создать такую скалярную функцию, как ReturnClosingTags(@N int)
но я не хочу добавлять к ней другой объект для базы данных. Я хочу, чтобы все это произошло в инструкции select, поэтому мне не нужно дополнительно модифицировать схему DB.
Я также знаю, что весь мой подход здесь (написание кода для разбора моего дерева в HTML) может быть ограниченным, поэтому не стесняйтесь комментировать альтернативу... но меня интересует вопрос сам по себе, поэтому даже если вы говорите: "Дух просто использует библиотеку.NET XYZ для этого". Я хотел бы узнать, есть ли ответ на эту маленькую загадку SQL.
У SQL Server есть встроенная функция: replicate()
.
select replicate('</ul></li>', depth)
Поскольку он возвращает тот же тип, что и первый аргумент, вам может понадобиться сначала cast()
значение в varchar(8000)
или varchar(max)
.