2013-08-03 13 views
1

這是一種複雜的問題,請耐心等待。計算SQL列中分配給字符串標記的數值的總值

我已經得到了基本概念想通了,感謝THIS QUESTION

SELECT LENGTH(col) - LENGTH(REPLACE(col, 'Y', '')) 

非常聰明的解決方案。

問題是,我試圖計算一個字符串標記的實例數量,然後將該計數器乘以一個代表該字符串數值的修飾符。哦,我有一個50-ish的代幣列表,每個代碼都有不同的值。

因此,採取字符串 「{5} {X} {白} {B/R} {2/U} {PG}」

仰望令牌的名單和他們的數值,我們可以得到這樣的:

{5} 5 
{X} 0 
{W} 1 
{b/r} 1 
{2/u} 2 
{pg} 1 
.... .... 

因此,字符串的合計值以上5 + 0 + 1 + 1 + 2 + 1 = 10

現在,我真正需要的是一個辦法做一個Join併爲TokenValue表的每一列執行上述替換令牌獲取長度技巧。

這有道理嗎?

僞SQL例如:

SELECT StringColumn, TotalTokenValue 
??? 
FROM TableWithString, TokenValueTable 

或許,這將更好地工作,作爲一個自定義功能?


編輯

我想我大約一半有,但它是一種醜陋。

SELECT  StringColumn, LEN(StringColumn) AS TotalLen, Token, 
       { fn LENGTH(Token) } AS TokenLength, TokenValue, 
       { fn REPLACE(StringColumn, Token, '') AS Replaced, 
       { fn LENGTH(Replaced) } AS RepLen, 
       { TotalLen - RepLen/TokenLength} AS TokenCount }, 
       { TokenCount * TokenValue} CalculatedTokenValue 
FROM   StringTable CROSS JOIN 
         TokenTable 

然後我需要包裝,在某種分組依據,並得到SUM(CalculatedTokenValue) 我能想象在我的頭上,有麻煩的SQL工作。

+0

哦,怎麼樣用值替換令牌,然後做某種類型的總和()函數?仍然停留在循環。在代碼中,我會做一些FOR循環,但仍然學習這個「盡一切努力在數據庫中」的趨勢。大聲笑。 –

+1

什麼是數據庫?甲骨文?自定義函數將是數據庫特定的。 – AngelWarrior

+0

無論使用.NET 2013打包。可能是SQL Server的變體。有一個FUNCTION文件夾,所以我假設我可以製作自定義文件夾。 :P –

回答

1

如果你創建了這一個觀點:

Create or replace view ColumnsTokens as 
    select StringColumn, Token, TokenValue, 
    (length(StringColumn) - length(replace(StringColumn, token, '')))/length(Token) TokenCount 
from StringTable 
join TokenTable on replace(StringColumn, Token, '') <> StringColumn ; 

將充當列和標記之間的許多一對多的關係表,我想你可以隨便寫你需要的任何查詢。例如,這會給你的總比分:

select StringColumn, sum(TokenCount * TokenValue) TotalTokenScore 
    from ColumnsTokens 
group by StringColumn ; 

(你唯一缺少的,沒有令牌StringColumns)

+0

現在就試試這個。 Nifty JOIN技巧;) –

+0

OK,所以REPLACE()函數無法正常工作。它似乎只是取代了LAST令牌。因此,只計算最終令牌的TokenValue。我在StringColumn中嘗試了幾個變體,結果是一致的。 –

+0

這很奇怪。也許你的數據庫提供了一些你可以使用的正則表達式函數。或者 - 如果你可以讓你對列中最大數量的標記進行安全假設 - 你可以使用嵌套替換,但這會有點混亂。 – Nicolas