0

だからここに私のコードがあります:

SELECT d.Args, c.Entered
FROM MailServer.dbo.Messages2Send d (NOLOCK)
INNER JOIN MailServer.dbo.ClickLog c (nolock) ON d.id = c.eMsgID
    where d.Date2Send >= '07/19/2013'
    and d.MessageTemplateNameRaw = 'Email.htm'
    and d.Destination NOT LIKE '%@company.com' and d.Destination NOT LIKE '%test%'
    ORDER BY d.Date2Send DESC

出力サンプル:

Args:
pSendInfo=VJ_13710731_V_000003295572
pSendInfo=VJ_13563134_V_000002649396
pSendInfo=VJ_13746113_V_000003553672
pSendInfo=VJ_13894398_V_000004219019
pSendInfo=VJ_13839988_V_000003968856

私の質問は、目的の出力のために 2 番目のアンダースコア _ の後にすべてを取得する方法です。たとえば、代わりに... pSendInfo=VJ_13710731_V_000003295572

表示させたいだけです... V_000003295572

前もって感謝します。

4

1 に答える 1

0

これを試してみてください (' _ V _ ' が一定の機能であると仮定します)

   select RIGHT( args, LEN(args)-CHARINDEX('_V_', args)-3)

編集

2番目の「_」を見つけるために、charindexへの別の呼び出しに最初のインデックスを渡すのはどうですか

   select RIGHT(args, LEN(args)- ( CHARINDEX('_', args, CHARINDEX('_', args)+1)))

TechNet hereの CharIndex の定義。

   CHARINDEX ( expressionToFind ,expressionToSearch [ , start_location ] )

引数

  • expressionToFind
    検索するシーケンスを含む文字式です。expressionToFind は 8000 文字に制限されています。
  • expressionToSearch
    検索する文字式です。
  • start_location
    検索を開始する整数または bigint 式です。start_location が指定されていない、負の数、または 0 の場合、検索は expressionToSearch の先頭から開始されます。

基本的に処理の順序で、charindex ( の 2 回目の呼び出しCHARINDEX('_', args)) を使用して最初のアンダースコアの位置の値を見つけ、それに 1 を加えた値を見つけ、(最初の呼び出しの) charindex の最後のパラメーターに新しいインデックスを使用しstart_locationて、長さを持つ 2 番目のアンダースコアを見つけます。文字列の先頭から 2 番目のアンダースコアまで、これが文字列全体の長さから差し引かれ、文字列の長さの残りの部分が得られた後、この文字列の右側の部分が長さで返されます。

于 2013-11-14T19:02:00.333 に答える