#sql-server #tsql #split
#sql-сервер #tsql #разделение
Вопрос:
Я не смог найти хорошую документацию по этому вопросу, но у меня есть таблица, в одном из столбцов которой есть длинная строка. Вот несколько примеров того, как это выглядит:
Hello:Goodbye:Apple:Orange
Example:Seagull:Cake:Chocolate
Я хотел бы создать новый вычисляемый столбец, используя STRING_SPLIT()
функцию для возврата третьего значения в таблице строк.
- Результат # 1: «Apple»
- Результат # 2: «Торт»
Каков правильный синтаксис для достижения этого?
Комментарии:
1. Вы не должны хранить такие данные в первую очередь. Это указывает на серьезную проблему проектирования базы данных. НО вы могли бы преобразовать эту строку в JSON, заменив
:
на","
, окружить ее["
и"]
и получить третий элемент массива2. Если вы действительно хотите иметь поле для хранения только пакета данных, которые не нужны для запроса, сохраните JSON. С другой стороны, если вам нужно было получить 3- й элемент, это означает. вероятно, вам все равно нужно использовать отдельные столбцы. SQL Server может использовать разреженные столбцы для эффективного хранения тысяч в основном пустых столбцов
Ответ №1:
На данный момент ваш ответ невозможен.
Выходные строки могут располагаться в любом порядке. Не гарантируется, что порядок подстрок будет соответствовать порядку подстрок во входной строке.
Невозможно гарантировать, какой элемент был третьим элементом в списке, используя string_split, и порядок может измениться без предупреждения.
Если вы хотите создать свой собственный, я бы рекомендовал ознакомиться с работой, проделанной
Брент Озар и Джефф Моден.
Ответ №2:
Вы не должны хранить такие данные в первую очередь. Это указывает на потенциально серьезную проблему проектирования базы данных. НО вы могли бы преобразовать эту строку в JSON, заменив: на ","
, окружить его ["
и "]
и получить третий элемент массива, например :
declare @value nvarchar(200)='Example:Seagull:Cake:Chocolate'
select json_value('["' replace(@value,':','","' ) '"]','$[2]')
Строковые манипуляции преобразуют строковое значение в :
["Example","Seagull","Cake","Chocolate"]
После этого JSON_VALUE анализирует строку JSON и извлекает 3-й элемент в массиве, используя выражение пути JSON.
Излишне говорить, что это будет медленно и не сможет использовать преимущества индексации. Если эти значения предназначены для чтения или записи по отдельности, они должны храниться в отдельных столбцах. Они, вероятно, займут меньше места, чем одна длинная строка.
Если у вас много необязательных полей, но только подмножество содержит значения в любое время, вы можете использовать разреженные столбцы. Таким образом, у вас могут быть тысячи строк, только некоторые из которых будут содержать данные в любое время