Выбор данных из столбца с разделителями канала

#sql #sql-server #pipe #extraction #delimited

#sql #sql-сервер #канал #извлечь #с разделителями

Вопрос:

У меня есть столбец ClientInformation в таблице CurrentOrders , который содержит строку с разделителями канала:

 5275=7147|109=62F36|5075=BCRM|12221=PortwareALGO1
  

каждый number= из них является тегом ИСПРАВЛЕНИЯ, который я хочу назвать своим собственным столбцом и должен иметь возможность использовать в SELECT инструкции и WHERE предложении.

Я взломал кое-что, что позволило мне идентифицировать нужные мне строки, но я не могу использовать в SELECT or WHERE

    (LEFT (RIGHT(ClientInformation, ( LEN(ClientInformation) - (PATINDEX('9=%',ClientInformation)   3) )),
    PATINDEX('%|%', RIGHT(ClientInformation, ( LEN(ClientInformation) - (PATINDEX('9=%',ClientInformation)   2) ))) -2))as AccountID
  

Я предполагаю, что мне нужно разбить каждый number= из них на отдельный столбец temp в моей таблице, но мне трудно найти объяснение, которому я могу следовать.

Итак, каждое из этих значений я хотел бы получить следующим образом:

 5275=7147|109=62F36|5075=BCRM|12221=PortwareALGO1

5275= as ClientBook
109= as AccountID
5075= as Broker ID
12221= as RouteTrace
  

Комментарии:

1. игнорировать, теперь я вижу, что это для SQL Server (patindex)

Ответ №1:

Следующий подход использует несколько ПЕРЕКРЕСТНЫХ приложений, потому что псевдоним, присвоенный каждому вычислению, повторно используется при следующем ПЕРЕКРЕСТНОМ ПРИМЕНЕНИИ, и в целом это помогает упростить код (IMHO).

 SELECT
      ClientBook
    , AccountID
    , BrokerID
    , RouteTrace
FROM CurrentOrders
      CROSS APPLY (
            SELECT
                  PATINDEX('%|%', ClientInformation)
                , LEN(ClientInformation)
      ) ca1 (p1, len1)
      CROSS APPLY (
            SELECT
                  p1   PATINDEX('%|%', SUBSTRING(ClientInformation, p1   1, len1))
      ) ca2 (p2)
      CROSS APPLY (
            SELECT
                  p2   PATINDEX('%|%', SUBSTRING(ClientInformation, p2   1, len1))
      ) ca3 (p3)
      CROSS APPLY (
            SELECT
                  SUBSTRING(ClientInformation, 1, p1 - 1)
                , SUBSTRING(ClientInformation, p1   1, p2 - p1 - 1)
                , SUBSTRING(ClientInformation, p2   1, p3 - p2 - 1)
                , SUBSTRING(ClientInformation, p3   1, len1)
      ) ca4 (s1, s2, s3, s4)
      CROSS APPLY (
            SELECT
                  LEFT(s1, PATINDEX('%=%', s1) - 1)
                , LEFT(s2, PATINDEX('%=%', s2) - 1)
                , LEFT(s3, PATINDEX('%=%', s3) - 1)
                , LEFT(s4, PATINDEX('%=%', s4) - 1)
      ) ca5 (ClientBook, AccountID, BrokerID, RouteTrace)
;
| CLIENTBOOK | ACCOUNTID | BROKERID | ROUTETRACE |
|------------|-----------|----------|------------|
|       5275 |       109 |     5075 |      12221 |
  

см.: http://sqlfiddle.com /#!3/f85bc/3