Извлечение строки из длинной строки - PullRequest
0 голосов
/ 18 октября 2019

У меня есть столбец с именем Config с данными, как показано ниже, это длинная строка

AutoFill = 1    Backgrouns = True  StoreAddress1 = '1601 River Road East'  StoreAddress2 = ''  StoreCity = 'Kitchener'  StoreProv = 'ON'  StorePostal = 'N2A 3Y4'  StorePhone = '(844) 607-6362'

, из которой мне нужно извлечь '1601 River Road East' и поместить его в другую таблицу в качестве адресной строки. 1, Китченер как город в этой таблице и ВКЛ как провинция в этой таблице, N2A 3Y4 в качестве почтового индекса

слово StoreAddress1 StoreAddress2 StoreCity всегда будет присутствовать в этой длинной строке и для других строк

я использую Microsoft SQL Server 2016, я знаю, что должен использовать patindex и подстроку, но не могу сделать запрос

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Это безобразно, как и все, но эй ... Я должен использовать DelimitedSplit8k_LEAD здесь, что касается второго разделения, порядковая позиция важна. В любом случае это делает "работу", но оставляет одинарные кавычки вокруг значений. Это зависит от вас, чтобы потом исправить.

WITH Pivoted AS(
    SELECT V.UndelimitedList,
           DSc.ItemNumber,
           MAX(CASE DSv.ItemNumber WHEN 1 THEN DSv.Item END) AS ColumnName,
           MAX(CASE DSv.ItemNumber WHEN 2 THEN DSv.Item END) AS ItemValue
    FROM (VALUES('AutoFill = 1    Backgrouns = True  StoreAddress1 = ''1601 River Road East''  StoreAddress2 = ''''  StoreCity = ''Kitchener''  StoreProv = ''ON''  StorePostal = ''N2A 3Y4''  StorePhone = ''(844) 607-6362'''))V(UndelimitedList)
         CROSS APPLY(VALUES(REPLACE(REPLACE(V.UndelimitedList,'  ','|'),' = ','~'))) CL(DelimitedList) --Assumes no values will have a double space, and all are separated by double space
                                                                                                       --Also assumes that a Pipe (|) and Tilda (~) will never appear in your data
         CROSS APPLY dbo.DelimitedSplit8K_LEAD(CL.DelimitedList,'|') DSc
         CROSS APPLY dbo.DelimitedSplit8K_LEAD(DSc.Item,'~') DSv
    GROUP BY V.UndelimitedList,
             DSc.ItemNumber
    HAVING MAX(CASE DSv.ItemNumber WHEN 1 THEN DSv.Item END) != '')
SELECT MAX(CASE P.ColumnName WHEN 'AutoFill' THEN NULLIF(P.ItemValue,'''''') END) AS AutoFill,
       MAX(CASE P.ColumnName WHEN 'Backgrouns' THEN NULLIF(P.ItemValue,'''''') END) AS Backgrouns,
       MAX(CASE P.ColumnName WHEN 'StoreAddress1' THEN NULLIF(P.ItemValue,'''''') END) AS StoreAddress1,
       MAX(CASE P.ColumnName WHEN 'StoreAddress2' THEN NULLIF(P.ItemValue,'''''') END) AS StoreAddress2,
       MAX(CASE P.ColumnName WHEN 'StoreCity' THEN NULLIF(P.ItemValue,'''''') END) AS StoreCity,
       MAX(CASE P.ColumnName WHEN 'StoreProv' THEN NULLIF(P.ItemValue,'''''') END) AS StoreProv,
       MAX(CASE P.ColumnName WHEN 'StorePostal' THEN NULLIF(P.ItemValue,'''''') END) AS StorePostal,
       MAX(CASE P.ColumnName WHEN 'StorePhone' THEN NULLIF(P.ItemValue,'''''') END) AS StorePhone
FROM Pivoted P
GROUP BY P.UndelimitedList;

DB <> Fiddle

0 голосов
/ 18 октября 2019

Если бы это был я, я бы использовал Visual Studio c #, чтобы изменить их, а не T-SQL, чтобы вы могли выполнить некоторую проверку ошибок. Что-то вроде следующего.

var cn = new System.Data.SqlClient.SqlConnection("your connection");
      cn.Open();
      var cmd = new System.Data.SqlClient.SqlCommand("Select YourLongField From YourTable", cn);
      var dt = new System.Data.DataTable();
      dt.Load(cmd.ExecuteReader());
      cmd.Dispose();
      for (int i = 0; i < dt.Rows.Count; i++)
      {        
        var split = dt.Rows[i]["YourLongField"].ToString().Split(' ');
        //Error check here before inserting a new record
        var cmdInsertNew = new System.Data.SqlClient.SqlCommand("Insert Into YourNiceNewTable (Address1, Address2, StoreCity, StoreProv, StorePostal, StorePhone) Values (@Address1, @Address2, @StoreCity, @StoreProv, @StorePostal, @StorePhone)", cn);
cmdInsertNew.Parameters.AddWithValue("@Address1", split[2]);
        cmdInsertNew.Parameters.AddWithValue("@Address2", split[3]);
        cmdInsertNew.Parameters.AddWithValue("@StoreCity", split[4]);
        cmdInsertNew.Parameters.AddWithValue("@StoreProv", split[5]);
        cmdInsertNew.Parameters.AddWithValue("@StorePostal", split[6]);
        cmdInsertNew.Parameters.AddWithValue("@StorePhone", split[7]);
        cmdInsertNew.ExecuteNonQuery();
        cmdInsertNew.Dispose();
      }
      cn.Dispose();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...