2012-05-01 6 views
0

SQL Server 2008 R2では、次のいずれかの特性を持つ文字列に含まれるアイテムの数を取得する必要があります。システム):SQL内の文字列内にランク付きおよびコンマ区切りのアイテムの数を取得

  • シーケンシャル項目が分離ダッシュでのみ最初のアイテムに取り付けられたダッシュ
  • 非増分文字で区切られた最初と最後の項目に要約カンマで区切られた各項目範囲
  • non-incを表す複数の文字上記

の指定

  • 組み合わせのremental部以下の全てが可能である:

    • R1、R2、R3、R4
    • R1-R4
    • R1-4
    • CP10-CP12
    • R1、R15-R19、RN5

    カンマ区切りの場合は、カンマ+1を数えることができますが、実際は他のオプションよりも一般的ではありません。

    最後のオプションをカウントする方法は、すべてのオプションで有効です。結果はに7

    は私の期待されるアプローチは以下のようになり次のようになります。

    1. は、ダッシュなしのアイテムを区切るが、カンマで区切られた=>
    2. は、ダッシュ区切りの項目を隔離カウントを取得し、非を削除-incremental文字(S)
    3. 大きい数から小さい数の減算及び1
    4. 総数
    0の最初の番号にその番号を追加する追加

    私はどこから始めようとも完全に行き詰まっています。何か案は?

  • +0

    ? –

    +0

    申し訳ありませんが、もともと私はそれを含んでいませんでした。これを今追加しました... SQL Server 2008 R2 – davids

    +0

    T-SQLではなくCLR関数を使用できますか? –

    答えて

    1

    これは、クリーンアップ/最適化することができ、故意に冗長ですが、開始する必要があります。特に、最後のIF内のロジックはWHILEのロジックとほぼ同じであり、左右の要素の数値を取得するブロックは4回繰り返されます。

    declare @input varchar(max) 
    set @input = 'R1,R15-R19,RN5-RN6' 
    
    select @input 
    
    declare @elements table 
    (
        Element varchar(10), 
        [Count] int 
    ) 
    
    declare @element varchar(10) 
    declare @index int 
    declare @count int 
    declare @left varchar(10) 
    declare @right varchar(10) 
    declare @position int 
    
    while (len(@input) > 0 and charindex(',', @input) > 0) 
    begin 
        set @element = substring(@input, 0, charindex(',', @input)) 
        if (charindex('-', @element) > 0) 
        begin 
         set @index = charindex('-', @element) 
         set @left = left(@element, @index - 1) 
         set @right = substring(@element, @index + 1, len(@element) - len(@left)) 
    
         set @position = 0 
         while (isnumeric(substring(@left, @position, 1)) = 0) 
         begin 
          set @position = @position + 1 
         end 
         set @left = substring(@left, @position, len(@left)) 
    
         set @position = 0 
         while (isnumeric(substring(@right, @position, 1)) = 0) 
         begin 
          set @position = @position + 1 
         end 
         set @right = substring(@right, @position, len(@right)) 
    
         set @count = cast(@right as int) - cast(@left as int) + 1 
        end 
        else 
        begin 
         set @count = 1 
        end 
        insert into @elements select @element, @count 
        set @input = replace(@input, @element + ',', '') 
    end 
    
    if (len(@input) > 0) 
    begin 
        set @element = @input 
        if (charindex('-', @element) > 0) 
        begin 
         set @index = charindex('-', @element) 
         set @left = left(@element, @index - 1) 
         set @right = substring(@element, @index + 1, len(@element) - len(@left)) 
    
         set @position = 0 
         while (isnumeric(substring(@left, @position, 1)) = 0) 
         begin 
          set @position = @position + 1 
         end 
         set @left = substring(@left, @position, len(@left)) 
    
         set @position = 0 
         while (isnumeric(substring(@right, @position, 1)) = 0) 
         begin 
          set @position = @position + 1 
         end 
         set @right = substring(@right, @position, len(@right)) 
    
         set @count = cast(@right as int) - cast(@left as int) + 1 
        end 
        else 
        begin 
         set @count = 1 
        end 
        insert into @elements select @element, @count 
    end 
    
    select * from @elements 
    select sum([Count]) from @elements 
    

    出力以下の結果:データベースおよびバージョン

    R1,R15-R19,RN5-RN6 
    
    R1  1 
    R15-R19 5 
    RN5-RN6 2 
    
    8 
    
    +0

    これは私が欲しかったもので、そこからビルドすることができます。 ! – davids

    1

    は、カンマ区切りのリストにカンマの数をカウントするためにトリックを使用することができます。

    select len(str) - len(replace(str, ',', '') 
    

    を完全なソリューションのために、あなたがより複雑な何かをする必要があり必要があります。以前は、splitという関数をダウンロードしました。これは区切られた文字列を受け取り、テーブルのようにコンポーネントを返します。実際、私はここからこれを選んだようです。 。 。 T-SQL: Opposite to string concatenation - how to split string into multiple records

    したがって、文字列を分割し、次にコンポーネントを解析してカウントするという考えがあります。あなたがハイフンでないなら、 "1"を数えます。ハイフンがある場合は、文字列を解析してカウントを取得する必要があります。

    +0

    'len(str) - len(replace(str、 '、'、 '')+1) – faffy

    関連する問題