2013-01-18 52 views
2

我使用從SSRS導入信息的存儲過程更新表。我有一個名爲頁面的字段。頁字段可以包含三種格式之一:將多種格式的字符串轉換爲單一標準格式

  1. 甲純數字字段例如1,2- 3等
  2. 數字與字母組合,例如圖1D中,如圖4C所示,7Z等
  3. 數字,儀表板和另外兩個數字,例如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的

+0

這聽起來像你已經在Excel中有一個工作函數?如果是這樣,它看起來是什麼樣子,以及您將其轉換爲TSQL的問題是什麼? – Pondlife

回答

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函數或存儲過程。應用這些規則是單元測試的一個很好的選擇,因爲定義和使用輸入和輸出值的測試集來驗證代碼很簡單。

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全模式我是測試出來。這就是說,我強烈建議將模式更新爲包含規範化頁碼的內容,並將其轉換爲表格。

+0

它花了幾次嘗試,但這是我想出的工作。更新MasterData 集合[基本頁] = 案例 \t \t當[頁]等 '[1-99]' 然後[頁] \t \t當[頁] LIKE '%[AZ]',那麼左([頁] ,1)+((ASCII(convert(varchar,(RIGHT([Page],1)))) - 64)*。01) \t \t當[頁]像'% - %'那麼LEFT [ ,1)+(cast(RIGHT([page],2)as int)*。01) end –

1

這是另一種選擇。

儘管此答案基於Pondlife's,但它返回decimal結果而不是字符串。

它大量使用隱式轉換,這就是爲什麼它看起來更緊湊。

它還假定只使用您的問題中提到的三種格式。如果存在「無效」格式的值,則會破壞此解決方案。

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 ... 
相關問題