1

これはちょっと複雑なので、我慢してください。

THIS QUESTIONのおかげで基本的な概念が理解できました

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

非常に賢い解決策。

問題は、文字列トークンのインスタンス数を数えようとしているところです。次に、そのカウンターを取得して、文字列の数値を表す修飾子を掛けます。ああ、それぞれ異なる値を持つ 50 個のトークンのリストがあります。

したがって、文字列「{5}{X}{W}{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 テーブルの各列に対して前述の replace-token-get-length トリックを実行する方法です。

それは理にかなっていますか?

疑似 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

次に、それをある種の Group By でラップし、SUM(CalculatedTokenValue) を取得する必要があります。SQL を機能させるのに苦労して、頭の中で想像できます。

4

1 に答える 1

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 のみが欠落しています)

于 2013-08-03T18:17:13.960 に答える