web-dev-qa-db-ja.com

整数のような演算子

テーブルにbigint(ProductSerial)タイプの列があります。 like演算子を使用して、製品シリアルでテーブルをフィルタリングする必要があります。しかし、私は、演算子のような整数型には使用できないことを発見しました。

これの他の方法はありますか(=演算子を使用したくない)。

13
Raging Bull

LIKEを使用する必要がある場合は、数値をchar/varcharにキャストし、その結果に対してLIKEを実行できます。これは非常に非効率的ですが、LIKEはとにかくインデックスを強制終了する可能性が高いため、シナリオで機能する可能性があります。

... AND CAST(phone AS VARCHAR(9)) LIKE '%0203'

LIKEを使用して数値の最初または最後を照合する場合は、整数除算演算子とモジュラス演算子を使用して、数字を抽出できます。たとえば、407で始まるすべての9桁の数字が必要な場合は、

phone / 1000000 = 407
14
dasblinkenlight

パーティーには少し遅れますが、数値型の列の最初のN個の指定された数値(この例では123)を照合するために使用しているメソッドを追加したいと思います。

SELECT * FROM MyTable WHERE MyColumn / POWER(10, LEN(MyColumn) - LEN(123)) = 123

この手法は@dasblinkenlightの手法と似ていますが、ターゲット列の値の桁数に関係なく機能します。これは、列に異なる長さの数値が含まれていて、CAST + LIKEメソッド(または計算列)を使用したくない場合に実行可能な回避策です。

その詳細(およびその他のLIKE回避策)については、このトピックについて書いた このブログ投稿 を参照してください。

3
Darkseal

Field PhoneNumbersを変更してStringとして保存し、Likeステートメントを使用してLIKEステートメントを使用できます。電話番号にBIGintを引き続き使用する場合は、使用しないと正確な電話番号を取得できません。 =使用できるメソッドは、範囲内の数値を検索するBetweenメソッドです。

編集した質問の場合:IDに=記号を使用するか、Intを文字列に変換してからLikeを使用する必要があると思います。

1
Albert Laure

電話番号に関連する元の質問。OPはそれ以降、シリアル番号を参照するように編集しています。この回答は元の質問のみを参照しています。

私の提案は、最初に電話番号を整数として保存しないことです。そのため、問題は発生しません。私の電話番号は、国際的には次のような形式です。

    +44 7844 51515

これを整数として保存しても、ここでは数学的な演算を実行する必要がなく、先頭のプラスが失われるため、意味がありません。英国内では、次のとおりです。

    07844 51515

したがって、整数として格納すると、先頭のゼロが失われます。それを整数として保存するという非常にvery特定の要件がない限り、文字列として保存するほうがはるかに適切です。

[注:実際には私の電話番号ではありません]

0
Adrian Wragg

データベースを制御できる場合は、計算列を追加して整数値を文字列にコピーできます。

ALTER TABLE MyTable
ADD CalcCol AS (CAST(ProductSerial AS VARCHAR)) PERSISTED

そして次のようにクエリします:

SELECT *
FROM MyTable
WHERE ProductSerial LIKE '%2548%'

これにより、計算が挿入/更新に移動し、各クエリのすべての行が変換されるのではなく、挿入/更新された行にのみ移動します。列に非常に小さなオーバーヘッドを追加するため、列に多くの更新がある場合、これは問題になる可能性があります。

モジュラスを使用して数学的にそれを行う方法があるかもしれませんが、これは多くのトレーニングとテストを必要とします。

0
bendataclear