2

SSRS から情報をインポートするストアド プロシージャを使用してテーブルを更新します。ページというフィールドがあります。ページ フィールドには、次の 3 つの形式のいずれかを含めることができます。

  1. 純粋な数値フィールド (1、2 3 など)。
  2. 1D、4C、7Z などの数字と文字の組み合わせ。
  3. 数字、ダッシュ、および 2 つの追加の数字 (例: 2-01、3-04、1-09 など)

並べ替えの目的と、ページ番号の一般的なカテゴリの定義を支援するために、各形式に相当するページを作成する必要があります。例 1 はベース ページ、例 2 はアート ページ、例 3 はテキスト ページです。

等価性については、例 1 は 1.00 形式になります。例 2 は、文字の等価数値に基づいて 1.01 から 1.26 までの等価になります。最後に、例 3 は 1.26 プラス .01 * ダッシュの右側の値になります。最小値は 1.27 です。

Excel でこれを実行しましたが、SQL で数式を正しく記述できないようです。

SQL Server 2008 R2 を使用しています

4

3 に答える 3

1

別のオプションがあります。

この回答はPondlife のに基づいていますが、文字列ではなく結果を返しdecimalます。

暗黙的な変換を多用しているため、よりコンパクトに見える場合があります。

また、質問に記載されている 3 つの形式のみが使用されていることも前提としています。「無効な」形式の値がある場合、このソリューションは機能しなくなります。

SELECT
  CASE
    WHEN PageNo NOT LIKE '%[^0-9]%' THEN PageNo
    WHEN PageNo     LIKE '%[A-Z]'   THEN LEFT(PageNo, LEN(PageNo) - 1)
                                         + (ASCII(RIGHT(PageNo, 1)) - 64) * 0.01
    WHEN PageNo     LIKE '%-%'      THEN REPLACE(PageNo, '-', '.') * 1.0 + 0.26
  END
FROM ...
于 2013-01-21T09:11:55.633 に答える
1

これは、あなたが説明するケースをカバーしているようです:

declare @t table (val varchar(10))
insert into @t 
select '1' union select '2' union
select '1D' union select '4S' union
select '2-01' union select '1-09'

select val, case
    when val not like '%[^0-9]%' then val + '.00'
    when val like '[0-9][A-Z]' then '1.' + right('0' + convert(varchar, ascii(right(val, 1))-64), 2)
    when val like '%-%' then convert(varchar, 1.26 + (0.01 * cast(substring(val, charindex('-', val)+1, 2) as int)))
    else val end
from
    @t

TSQL は、文字列の操作と解析に適した言語ではないため、これには CLR 関数またはストアド プロシージャの使用を検討することをお勧めします。また、これらのルールを適用することは単体テストに適しています。入力値と出力値のテスト セットを簡単に定義して使用し、コードを検証できるからです。

于 2013-01-18T17:32:12.763 に答える
0

これは醜く、おそらくあまりパフォーマンスが高くありませんが、次のようになります。

select
  page_num,
  case
    when page_num like '%A' then substring(page_num, 1, len(page_num)-1) + '.01'
    when page_num like '%B' then substring(page_num, 1, len(page_num)-1) + '.02'
    when page_num like '%C' then substring(page_num, 1, len(page_num)-1) + '.03'
    when page_num like '%D' then substring(page_num, 1, len(page_num)-1) + '.04'
    when page_num like '%E' then substring(page_num, 1, len(page_num)-1) + '.05'
    when page_num like '%F' then substring(page_num, 1, len(page_num)-1) + '.06'
    when page_num like '%G' then substring(page_num, 1, len(page_num)-1) + '.07'
    when page_num like '%H' then substring(page_num, 1, len(page_num)-1) + '.08'
    when page_num like '%I' then substring(page_num, 1, len(page_num)-1) + '.09'
    when page_num like '%J' then substring(page_num, 1, len(page_num)-1) + '.10'
    when page_num like '%K' then substring(page_num, 1, len(page_num)-1) + '.11'
    when page_num like '%L' then substring(page_num, 1, len(page_num)-1) + '.12'
    when page_num like '%M' then substring(page_num, 1, len(page_num)-1) + '.13'
    when page_num like '%N' then substring(page_num, 1, len(page_num)-1) + '.14'
    when page_num like '%O' then substring(page_num, 1, len(page_num)-1) + '.15'
    when page_num like '%P' then substring(page_num, 1, len(page_num)-1) + '.16'
    when page_num like '%Q' then substring(page_num, 1, len(page_num)-1) + '.17'
    when page_num like '%R' then substring(page_num, 1, len(page_num)-1) + '.18'
    when page_num like '%S' then substring(page_num, 1, len(page_num)-1) + '.19'
    when page_num like '%T' then substring(page_num, 1, len(page_num)-1) + '.20'
    when page_num like '%U' then substring(page_num, 1, len(page_num)-1) + '.21'
    when page_num like '%V' then substring(page_num, 1, len(page_num)-1) + '.22'
    when page_num like '%W' then substring(page_num, 1, len(page_num)-1) + '.23'
    when page_num like '%X' then substring(page_num, 1, len(page_num)-1) + '.24'
    when page_num like '%Y' then substring(page_num, 1, len(page_num)-1) + '.25'
    when page_num like '%Z' then substring(page_num, 1, len(page_num)-1) + '.26'
    when page_num like '%-%' then 
      substring(page_num, 1, charindex('-', page_num)-1) + '.' + 
      cast((26+cast(substring(page_num, charindex('-', page_num)+1, len(page_num)) as int)) as varchar(12))                                                                                                          
    else page_num + '.00'
  end
from pages

私がテストしていた完全なスキーマについては、 SQL Fiddleを参照してください。

そうは言っても、正規化されたページ番号を含むものにスキーマを更新し、途中でこれをテーブルに変換することを強くお勧めします。

于 2013-01-18T16:50:33.543 に答える