3

パイプで区切られた文字列を含むClientInformationテーブルに列があります。CurrentOrders

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

それぞれnumber=は、独自の列として名前を付けたい FIX タグであり、SELECTステートメントとWHERE句で使用できるようにする必要があります。

必要な行を特定できるようにハッキングしましたが、inSELECTまたはWHERE...を使用できません。

   (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
4

1 に答える 1

0

次のアプローチでは、複数の CROSS APPLY を使用します。これは、各計算に指定されたエイリアスが次の CROSS APPLY で再利用可能であり、全体的にコードを簡素化するのに役立つためです (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

于 2014-06-22T06:16:55.667 に答える