У меня есть таблица SQL, как это:
| SomeID | OtherID | Data
+----------------+-------------+-------------------
| abcdef-..... | cdef123-... | 18,20,22
| abcdef-..... | 4554a24-... | 17,19
| 987654-..... | 12324a2-... | 13,19,20
Есть ли запрос, где я могу выполнить запрос, SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......'
который возвращает отдельные строки, например:
| OtherID | SplitData
+-------------+-------------------
| cdef123-... | 18
| cdef123-... | 20
| cdef123-... | 22
| 4554a24-... | 17
| 4554a24-... | 19
В основном разделить мои данные по запятой на отдельные строки?
Я знаю, что хранить comma-separated
строку в реляционной базе данных звучит глупо, но обычный вариант использования в потребительском приложении делает это действительно полезным.
Я не хочу делать разделение в приложении, так как мне нужно подкачки страниц, поэтому я хотел изучить варианты перед рефакторингом всего приложения.
Это SQL Server 2008
(не-R2).
sql-server
tsql
split
comma
Майкл Стум
источник
источник
Ответы:
Вы можете использовать замечательные рекурсивные функции из SQL Server:
Образец таблицы:
Запрос
Вывод
источник
Data
отvarchar(max)
доvarchar(4000)
, напримерcreate table Testdata(SomeID int, OtherID int, Data varchar(4000))
?OPTION (maxrecursion 0)
Наконец, ожидание закончено с SQL Server 2016 . Они представили функцию Split string
STRING_SPLIT
:Все остальные методы разделения строки, такие как XML, таблица Tally, цикл while и т. Д., Были уничтожены этой
STRING_SPLIT
функцией.Вот отличная статья со сравнением производительности: сюрпризы производительности и предположения: STRING_SPLIT .
Для более старых версий использование таблицы подсчета здесь представляет собой одну функцию разделения строк (наилучший возможный подход)
По рекомендации от Tally OH! Улучшенная функция CSV Splitter для SQL 8K
источник
value
нетSplitData
.Проверь это
источник
источник
CROSS APPLY
, это довольно полезноselect t.OtherID, x.* from testData t cross apply (select item as Data from dbo.Split(t.Data,',') ) x
По состоянию на февраль 2016 года - см. Пример таблицы TALLY - очень вероятно, что он превзойдет мой TVF ниже, с февраля 2014 года. Сохранение исходного поста ниже для потомков:
Слишком много повторного кода на мой взгляд в приведенных выше примерах. И мне не нравится производительность CTE и XML. Кроме того, явный,
Id
так что потребители, которые являются специфическими для заказа, могут указатьORDER BY
предложение.источник
Приятно видеть, что это было решено в версии 2016 года, но для всех тех, кто не об этом, вот две обобщенные и упрощенные версии описанных выше методов.
XML-метод короче, но, конечно, требуется, чтобы строка учитывала xml-трюк (без «плохих» символов).
XML-метод:
Рекурсивный метод:
Функция в действии
XML-МЕТОД 2: Unicode Friendly Ad (Дополнение любезно предоставлено Максом Ходжесом)
create function dbo.splitString(@input nVarchar(max), @Splitter nVarchar(99)) returns table as Return SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data FROM ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);
источник
Пожалуйста, обратитесь ниже TSQL. Функция STRING_SPLIT доступна только на уровне совместимости 130 и выше.
TSQL:
РЕЗУЛЬТАТ:
Цвет
красный синий зелёный жёлтый чёрный
источник
Очень поздно, но попробуйте это:
Итак, у нас было это: tbl_Sample:
После выполнения этого запроса:
Спасибо!
источник
STRING_SPLIT
изящен, но требует SQL Server 2016. docs.microsoft.com/en-us/sql/t-sql/functions/…источник
только с небольшим изменением вышеупомянутого запроса ...
источник
Я всегда использую метод XML. Убедитесь, что вы используете VALID XML. У меня есть две функции для преобразования между действительным XML и текстом. (Я, как правило, убираю возврат каретки, потому что я обычно не нуждаюсь в них
источник
SELECT (SELECT '<&> blah' + CHAR(13)+CHAR(10) + 'next line' FOR XML PATH(''))
функция
Случай использования
Или просто выберите с множественным набором результатов
источник
Ниже работает на SQL Server 2008
Получит все декартовы произведения со столбцами таблицы происхождения плюс «элементы» разделенной таблицы.
источник
Вы можете использовать следующую функцию для извлечения данных
источник