このリンクによると、それは逃げ道[[
ではなく[
、むしろのように見え[[]
ます。つまり、左右の角かっこペア内の左角かっこです。
この場合、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を起動して実行するには、少し時間が必要でした。