#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 |