1

私は抽出したフィールドの1つが次のようなデータベースで作業しています:

1-117 3-134 3-133

これらの各数値セットは、別のテーブルの異なるデータ セットを表します。例1-117として、1=機器ID、117=機器設定。

前のフィールドに基づいてデータを抽出する必要がある別のテーブルがあります。機器 ID と設定を分割する 2 つの列があります。基本的に、クエリ対象の列から移動し、クエリ1-117を実行して、1 と 117 が対応する 2 つの別個の列である別のテーブルからデータを抽出する方法が必要です。

それで、この数を分割してこのクエリを実行する方法はありますか?

1-117 3-134 3-133また、これら 3 つの数値 ( ) を 3 つの異なるクエリ セットに分割するにはどうすればよいでしょうか?

ここで注意が必要なのは、この列に任意の数のセット (1-117 3-133または など1-117 3-134 3-133 2-131) を含めることができることです。

抽出されたデータを表示するために、より大きなドキュメントの一部としてストアド プロシージャでこれらのクエリを作成しています。

助けてくれてありがとう。

4

3 に答える 3

1

DBベンダーを提供しなかったため、SQL ServerとOracleについてそれぞれこの質問に答える2つの投稿があります...

T-SQL: 文字列連結の反対 - 文字列を複数のレコードに分割する方法

PL/SQL ストアド プロシージャでカンマ区切りの文字列を分割する

他の DBMS を使用している場合は、「分割テキスト」を検索してください。私は、あなたが最初に尋ねる人ではないことをほぼ保証できます。あらゆる DBMS フレーバーに対する答えがあります。

あなたが言ったように、フォーマットは一定ですが、SUBSTRING関数を使用してもっと簡単なこともできます。

OPコメントに応じて編集...

SQL Server を使用していて、これらの値は常に一貫した形式であると述べたので、SUBSTRING を使用して値の各部分を取得し、それらを T-SQL 変数に割り当てるのと同じくらい簡単なことを行うことができます。クエリの述語で使用するなど、必要なことを行うためにそれらを使用します。

于 2012-07-12T23:39:09.410 に答える
1

フォーマットが常に #-### (正確に 1 桁、ダッシュ、3 桁) であるということについてあなたが言ったことが正しいと仮定すると、これはかなり簡単です。

WITH EquipmentSettings AS (
   SELECT
      S.*,
      Convert(int, Substring(S.AwfulMultivalue, V.Value * 6 - 5, 1) EquipmentID,
      Convert(int, Substring(S.AwfulMultivalue, V.Value * 6 - 3, 3) Settings
   FROM
      SourceTable S
      INNER JOIN master.dbo.spt_values V
         ON V.Value BETWEEN 1 AND Len(S.AwfulMultivalue) / 6
   WHERE
      V.type = 'P'
)
SELECT
   E.Whatever,
   D.Whatever
FROM
   EquipmentSettings E
   INNER JOIN DestinationTable D
      ON E.EquipmentID = D.EquipmentID
      AND E.Settings = D.Settings

SQL Server 2005 以降では、このクエリは文字列で 1365 個の値をサポートします。

桁の長さが異なる場合は、少し難しくなります。お知らせ下さい。

于 2012-07-13T04:07:34.967 に答える
0

セットが 4 を超えて増加しない場合は、Parsename を使用して結果を取得できます。

 Declare @Num varchar(20)
 Set @Num='1-117 3-134 3-133'

 select parsename(replace (@Num,' ','.'),3)

 Result :- 1-117

 Now again use parsename on the same resultset 

 Select parsename(replace(parsename(replace (@Num,' ','.'),3),'-','.'),1)

 Result :- 117

4 つ以上の値がある場合は、分割関数を使用します

于 2012-07-13T01:00:08.700 に答える