2015-12-11 3 views
-2

У меня есть таблица под названием Entities с колонкой CustomData.Извлечь адрес электронной почты от строки

Мне нужно извлечь адрес электронной почты из каждой строки. Также, если значение null, мне нужно показать как null.

Примеры строк из CustomData:

Id  CustomData                                              Name 
273  [{"Name":"Customer","Value":"test customer"},{"Name":"Address","Value":null},{"Name":"Email","Value":null},{"Name":"Company Name","Value":null},{"Name":"Other Phone","Value":null}]   2323123213 
274  [{"Name":"Customer","Value":"Cash Sale"},{"Name":"Address","Value":null},{"Name":"Email","Value":"[email protected]"},{"Name":"Company Name","Value":null},{"Name":"Other Phone","Value":null}] 2222222222 

Это строка я буду использовать, чтобы обновить свою систему.

Я уже достиг выбора номера телефона, который формирует эти же данные, но это была фиксированная длина. Я не могу потянуть адрес электронной почты.

Я вывешу несколько различных методов, я пытался до сих пор, как только им назад на моем компьютере

+1

Привет, как вы пробовали писать сами? 'SELECT [???????????] FROM [Entities] WHERE [Id] = @ entityId' на самом деле не кажется попыткой. –

+0

Являются ли эти данные Json? – JsonStatham

+0

Еще один пример того, почему вы не храните разделительные значения в одном столбце. –

ответ

1

Ну, в таких денормализованного данных единственным вариантом является, чтобы разобрать его и попытаться получить электронную почту. Самый элегантный способ - использовать json-парсер, но он не доступен в текущих версиях SQL-сервера, поэтому вам нужно разобрать его вручную.

Предполагая, что каждая запись для электронной почты начинается с {"Name":"Email","Value":, вы можете сделать это в несколько этапов:

  1. Find положение {"Name":"Email","Value": в строке.
  2. Найти первое появление } в правой части строки.
  3. Получите подстроку между ними.
  4. Проверьте, соответствует ли строка строке «null», а затем возвращает значение null, в противном случае возвращает строку.

Так что может быть сделано как в этом фрагменте кода:

declare @data nvarchar(max), @pattern nvarchar(max) 

select @data = '[{"Name":"Customer","Value":"test customer"}, 
       {"Name":"Address","Value":null}, 
       {"Name":"Email","Value":null}, 
       {"Name":"Company Name","Value":null}, 
       {"Name":"Other Phone","Value":null}]' 

select @pattern = '{"Name":"Email","Value":' 

select nullif(substring(@data, 
      charindex(@pattern, @data, 0) + len(@pattern), 
      charindex('}', @data, charindex(@pattern, @data, 0)) 
       - charindex(@pattern, @data, 0) - len(@pattern) 
      ), 'null') 
Смежные вопросы