0

SQL SERVER 2008 R2 では、次のいずれかの特性を持つ文字列に含まれる項目の数を取得する必要があります (システムではなくユーザーによって制御されます)。

  • コンマで区切られた各項目
  • ダッシュで区切られた最初と最後の項目で要約された連続した項目
  • ダッシュで区切られた範囲の最初の項目のみに付加された非増分文字
  • 指定の非増分部分を表す複数の文字
  • 上記の組み合わせ

次のすべてが可能です。

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

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

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

私の予想されるアプローチは次のとおりです。

  1. ダッシュなしでコンマで区切られたアイテムを区切る=>カウントを取得する
  2. ダッシュで区切られた項目を分離し、非増分文字を削除します
  3. 大きい数から小さい数を引き、1を足す
  4. その数を合計数の最初の数に追加します

私はどこから始めても完全に立ち往生しています。何か案は?

4

2 に答える 2

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
于 2012-05-01T22:13:07.010 に答える
1

コンマ区切りのリスト内のコンマの数を数えるトリックを使用できます。

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

完全な解決策を得るには、もっと複雑なことをする必要があります。ずいぶん前に、分割された文字列を受け取り、コンポーネントをテーブルのように返す、split という関数をダウンロードしました。実はここから拾ったらしい。. . T-SQL: 文字列連結の反対 - 文字列を複数のレコードに分割する方法

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

于 2012-05-01T21:42:02.593 に答える