【问题标题】:Selecting data from a pipe delimited column从管道分隔的列中选择数据
【发布时间】:2014-08-10 06:54:30
【问题描述】:

我在表CurrentOrders 中有一个列ClientInformation,其中包含一个竖线分隔的字符串:

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

每个number= 都是一个FIX 标记,我想将其命名为自己的列,并且需要能够在SELECT 语句和WHERE 子句中使用。

我破解了一些东西,让我可以识别我需要的行,但我不能在 SELECTWHERE 中使用...

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

我假设我需要将每个 number= 分解到我表中自己的临时列中,但我很难找到可以遵循的解释。

所以,我希望这些值中的每一个如下:

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

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

【问题讨论】:

  • 忽略,我现在看到它是用于 SQL Server (patindex)

标签: sql sql-server pipe extraction delimited


【解决方案1】:

以下方法使用多个 CROSS APPLY,因为为每个计算提供的别名可在下一个 CROSS APPLY 中重复使用,总体而言,这有助于简化代码 (恕我直言)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多