Как разобрать строку после n-го разделителя в SQL - PullRequest
0 голосов
/ 05 мая 2020

Я хочу проанализировать строку после символа подчеркивания nth. Например, в строке:

2020_Campaign_SG_Test Email

Мне нужно:

  • Извлечь текст Campaign после первого подчеркивания и перед вторым и создайте столбец с именем Type
  • Извлеките текст SG после второго подчеркивания и перед
    3rd и создайте столбец с именем Segment
  • Извлеките текст Test Email после третьего символа подчеркивания и создать столбец с именем

1 Ответ

1 голос
/ 06 мая 2020

Так как вы используете SQL Server 16 или выше, вы можете использовать STRING_SPLIT (убедитесь, что ваш уровень совместимости не менее 130, чтобы использовать его).

Я был невозможно заставить следующий код работать с любыми ссылками на скрипты, но вы можете скопировать / вставить его в https://sqliteonline.com/ (установите его на MS SQL, подключитесь, скопируйте / вставьте код и запустите):

enter image description here

Код

Вот самая простая форма, которую я смог придумать:

WITH x AS (
  SELECT
      value v,
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n
    from STRING_SPLIT('2020_Campaign_SG_Test Email','_')  
)

SELECT
    [2] [Type],
    [3] Segment,
    [4] [Name]
  FROM x
  PIVOT(
    MAX(v) FOR n IN([2],[3],[4])
  ) y

Вывод

Это сгенерирует следующее (первая строка - заголовок таблицы):

# Type        Segment    Name
  Campaign    SG         Test Email

Пояснение

STRING_SPLIT раздел

WITH x AS (
  SELECT
      value v,
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n
    from STRING_SPLIT('2020_Campaign_SG_Test Email','_')  
)

В первой части я создаю временный именованный набор результатов x (он же CTE или обычное табличное выражение ). В наборе результатов используется функция STRING_SPLIT для разделения строки 2020_Campaign_SG_Test Email на символ подчеркивания _. Я также нумерую вывод набора результатов, используя ROW_NUMBER().

Это генерирует следующее (первая строка - заголовок таблицы):

# v              n
  2020           1
  Campaign       2
  SG             3
  Test Email     4

PIVOT section

SELECT
    [2] [Type],
    [3] Segment,
    [4] [Name]
  FROM x
  PIVOT(
    MAX(v) FOR n IN([2],[3],[4])
  ) y

Затем вторая часть берет наш результирующий набор x и переносит строки данных в столбцы относительно агрегирования с помощью оператора PIVOT. Агрегатная функция здесь MAX(v) FOR n IN([2],[3],[4]). Использование функции MAX удаляет все значения NULL (в противном случае она будет перемещать и каждое v в свой собственный столбец и добавлять NULL значений для других столбцов) и дает нам только второй, третий и четвертый элементы в качестве вывода (поскольку вы указали только эти 3 элемента в качестве вывода в исходном вопросе).

...