Создание нескольких столбцов из одного столбца разными разделителями - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть столбец в таблице SQL. Колонна "Дамба"

SELECT Dam
FROM [dbo].[names]

Для большинства данных в столбце они представлены в следующем формате

Марафон Нелла (Jpn) 1942

Я бы хотел ОБНОВИТЬ базу данных, чтобы разделить столбец на три с помощью

Dam_Name = Marathon Nella
Dam_Country = Jpn
Dam_YOB = 1942

Изредка / Редко у меня есть только значение Dam_Name в поле, и его нет (для работы в качестве разделителя. В этом случае я бы хотел, чтобы Dam_Name оставался как есть, а Dam_Country и Dam_YOB были равны NULL

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

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Можно сделать это с помощью трюков XML:

;WITH splitValues AS
(
SELECT id,
           LTRIM(RTRIM(m.n.value('.[1]', 'varchar(8000)'))) AS splitValue, 
           CASE ROW_NUMBER()OVER (PARTITION BY id ORDER BY id) WHEN 1 THEN 'Name' WHEN 2 THEN 'Country' ELSE 'YOB' end AS columnHeader
    FROM
    (
        SELECT id,
               CAST('<XMLRoot><RowData><ColumnData>'
                    + REPLACE(REPLACE(string, '(', '</ColumnData><ColumnData>'), ')', '</ColumnData><ColumnData>')
                    + '</ColumnData></RowData></XMLRoot>' AS XML) AS xmlString
        FROM #x
    ) xmlTable
        CROSS APPLY xmlString.nodes('/XMLRoot/RowData/ColumnData') m(n))

This gives you results like:
========================
id    splitValue       columnHeader
1     Marathon Nella   Name
1     Jpn              Country
1     1942             Year

Далее Обновите таблицу:

   UPDATE table
   SET Name = splitValue
   From table INNER JOIN
        splitValues ON table.Id = splitValues.Id AND columnHeader = 'Name'

и т. Д.

0 голосов
/ 12 апреля 2019

Что ж, извлечение строк не так просто в SQL Server.Предполагая, что страна состоит из трех символов:

select left(dam, charindex('(', dam + ' (') - 2) as name,
       nullif(left(stuff(dam, 1, charindex('(', dam + '('), ''), 3), '') as country,
       nullif(stuff(dam, 1, charindex(')', dam + ')'), ''), '') as dob
from (values ('Marathon Nella (Jpn)1942'), ('testing a')) v(dam)

Это можно изменить, если эти условия не соответствуют действительности, но это дает представление о том, что делать.

Здесь это дб <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...