3

私が指定したもの以外の文字列で特殊文字を見つけたいことに注意してください。

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]' 
SELECT PATINDEX('%[^0-9A-Za-z .&()[[,''-]%',@Temp1)

長い発見の後、左角かっこを許可するために2回入力する必要があります[すなわち[[しかし、これは右角かっこには当てはまりません。式PATINDEX('%[^ 0-9A-Za-z。&()[ []、''-]%'、@ Temp1)は、期待される適切な結果を提供しません。

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]' 
SELECT PATINDEX('%[^0-9a-z .&()[[],''-]%',@Temp1)

上記のコードは、大文字を削除したため、patindex0を返します。'R'の一致の場合は1を返す必要があります。したがって、右角かっこに適切に一致するものは何ですか。

4

1 に答える 1

3

このリンクによると、それは逃げ道[[ではなく[、むしろのように見え[[]ます。つまり、左右の角かっこペア内の左角かっこです。

この場合、PATINDEX次のようになります。

PATINDEX('%[^0-9A-Za-z .&()[[]],''-]%',@Temp1)

]最初のものが一致するようにペアを]閉じるので、追加に注意してください。[][

編集#1:

このようなことを試してみたらどうでしょうか。私たちが行っているのは、最初に面倒な[]文字をに置き換えて()から、リストにない特殊文字を検索することです。

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]'
SET @Temp1 = REPLACE(@Temp1,'[','(')
SET @Temp1 = REPLACE(@Temp1,']',')')
SELECT PATINDEX('%[^0-9A-Za-z .&(),''-]%',@Temp1)

残念ながら、現時点ではSQL Serverの作業用コピーがないため、これをテストすることはできません。インストールしたら、少しテストしてみます。

編集#2:

テストできるようになったので、これが可能な解決策であることを確認しました。

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]+'
SET @Temp1 = REPLACE(@Temp1,'[','.')
SET @Temp1 = REPLACE(@Temp1,']','.')
SET @Temp1 = REPLACE(@Temp1,'-','.')
SELECT PATINDEX('%[^0-9a-z .&(),'']%',@Temp1 COLLATE Latin1_General_BIN)

克服する必要のあるいくつかの課題がありました。

  • 私のデータベースのコードページでは大文字と小文字が区別されませんでした(SQL_Latin1_General_CP1_CI_AS)。私はCOLLATEこれを回避するために使用する必要がありました。BIN照合でさえCS期待どおりに動作しなかったため、照合を使用したことに注意してください。これにより、削除A-Zがまだ一致しないという問題が修正されましたR
  • 元の式の-文字がPATINDEX正しく機能していませんでした。これはおそらく、式の特殊文字(つまり、の「through」a-z)であるためです。私はそれを次のようにエスケープしようと--しましたが、これが機能している間に、aの追加のテストケース+が壊れました。-これは本当に奇妙だと思いましたが、最終的には、拒否することを知っていた別のキャラクターに置き換える方が簡単かもしれないと判断しました( .)。
  • 文字列関数は、式から問題のある特殊文字を完全に削除することによりREPLACE、(そして実際に機能するように)複雑さを軽減します。PATINDEXで拒否する文字が常に少なくとも1つあると仮定するとPATINDEX、これらのREPLACE式を使用することは実行可能な解決策になるはずです。理論的には少し遅くなりますが、それが重要かどうかを確認するために実際にテストする必要があります。

私はそれをテストすることができたので、この解決策が機能することを知っています。SQL Server Express Editionを起動して実行するには、少し時間が必要でした。

于 2012-12-17T14:54:29.297 に答える