SQL Server: STRING_SPLIT() приводит к вычисляемому столбцу

#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

Невозможно гарантировать, какой элемент был третьим элементом в списке, используя 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.

Излишне говорить, что это будет медленно и не сможет использовать преимущества индексации. Если эти значения предназначены для чтения или записи по отдельности, они должны храниться в отдельных столбцах. Они, вероятно, займут меньше места, чем одна длинная строка.

Если у вас много необязательных полей, но только подмножество содержит значения в любое время, вы можете использовать разреженные столбцы. Таким образом, у вас могут быть тысячи строк, только некоторые из которых будут содержать данные в любое время