sql >> データベース >  >> RDS >> Sqlserver

文字が数字かどうかを確認する最速の方法は?

    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);
    


    1. Javaの例外を除いてPostgresトランザクションを続行します

    2. 挿入...マージ...選択(SQL Server)

    3. テーブルをMySQLにインポートするときにCSV値内のコンマをエスケープするにはどうすればよいですか?

    4. エラー:gemネイティブ拡張のビルドに失敗しました-mysql2のインストール中にエラーが発生しました