Оценка столбца с использованием STRING_SPLIT () - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть таблица, в которой один столбец содержит несколько адресов электронной почты или имен в одной строке:

+----+-------------------------------------------------------+
| id ¦ emails                                                ¦
+----+-------------------------------------------------------+
| 1  ¦ John Doe; jdoe@gmail.com; Company IT; jd@company.com; ¦
+----+-------------------------------------------------------+
| 2  ¦ jane@company.com; Jane Doe; jd@company.com;           ¦
+----+-------------------------------------------------------+

Мне нужно оценить столбец сообщений электронной почты, чтобы определить, существуют ли внешние адреса электронной почты (например, jdoe@gmail.com),Итак, мне нужно разделить значения в столбце emails на отдельные строки и оценить каждую строку. В конце я хотел бы обновить таблицу дополнительным столбцом, указывающим, являются ли электронные письма внутренними или внешними.

+----+-------------------------------------------------------+-----------+
| id ¦ emails                                                ¦ flag      ¦
+----+-------------------------------------------------------+-----------+
| 1  ¦ John Doe; jdoe@gmail.com; Company IT; jd@company.com; ¦ external  ¦
+----+-------------------------------------------------------+-----------+
| 2  ¦ jane@company.com; Jane Doe; jd@company.com;           ¦ internal  ¦
+----+-------------------------------------------------------+-----------+

Мне удалось разделить строку с помощью STRING_SPLIT() и выполнить оценку, которую я хотел бы (в некотором роде).

DECLARE @flag int

SELECT @flag=COUNT(*) FROM STRING_SPLIT('John Doe; jdoe@gmail.com; Company IT; jd@company.com;', ';')
WHERE value LIKE '%@%'AND value NOT LIKE '%Company%'

IF (@flag > 0)
BEGIN
Print 'extern'
END
ELSE 
BEGIN
Print 'intern'
END

Однако сейчас я передаюстрока для функции STRING_SPLIT(). Вместо этого я хотел бы пропустить столбец emails и обновить таблицу в соответствии с результатами оценки. Есть идеи как этого добиться?

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете сделать это в select как:

select t.*,
       (case when e.cnt > 0 then 'external' else 'internal' end) as flag
from t cross apply
     (select count(*) as cnt
      from string_split(t.emails, ';') s
      where value LIKE '%@%' AND value NOT LIKE '%Company%'
     ) e;

Примечание: это сохраняет оригинальную логику ОП для идентификации «внутренний» и «внешний». Вопрос, похоже, не об этом. Очевидно, что эта версия сбивает с толку компоненты имени пользователя и домена, поэтому имя пользователя может фактически содержать название компании, даже если ОП может хотеть, чтобы оно было «внешним».

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

...