これはちょっと複雑なので、我慢してください。
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 を機能させるのに苦労して、頭の中で想像できます。