WHERE col LIKE '[0-9]'
の違いを検出できるとしたら、私は非常に驚かれることでしょう。 そしてあなたが思いついた他の方法。しかし、私はデニスに同意します。それを関数に入れて、すべてのコードで一貫して同じチェックを使用するようにします (または、少なくとも、大規模なスキャンなどのために UDF を回避している場合は、コードにマーカーを配置します。後で大規模に変更しやすくします)。
とはいえ、スカラー UDF を使用するだけで、関数内で解析するために使用する方法よりも多くのパフォーマンス ヒットが見られることは間違いありません。 UDF のパフォーマンスと CASE
を使用してインラインで実行するパフォーマンスを比較する必要があります。 .例
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
これにより、NULL
が生成されます 文字が数値でない場合。
ローカル変数のチェックだけを扱っている場合は、どの解析方法を使用しても問題はなく、最適化の取り組みを別の場所に集中させたほうがよいでしょう。
編集 デモの JOIN
に提案を追加する 句。これにより、一定のスキャンが少なくなる可能性がありますが、はるかに読みやすくなります (部分文字列の呼び出しがはるかに少なくなるなど):
;WITH v AS
(
SELECT /* other columns, */ patientPostal,
ss = SUBSTRING(v.patientPostal,2,1),
FROM [whatever table is aliased v in current query]
)
SELECT /* column list */
FROM [whatever table is aliased z in current query]
INNER JOIN v ON z.postal = CONVERT(INT, CASE
WHEN v.ss = '0' THEN ss
WHEN v.ss LIKE '[1-9]' THEN LEFT(v.patientPostal, 3)
END);