2011-02-05 40 views
0

私はSQL Serverデータベースを持っており、int列の最初の2つの数値のみに基づいて結果を返すクエリを定義します。以下のようなSQL Server WHERE句

何か:

SELECT * FROM myTable WHERE myIntColumn = 13% 

だから13、133、134と1380との任意の行がちょうどvarchar型とパターンマッチに変更する、空想

答えて

5

何も返さないであろう。

SELECT * FROM myTable 
    WHERE CAST(myIntColumn as varchar(10)) LIKE '13%' 

あなたは10の力によってdivde整数でしたが、それはあなたが文字列に数値を変換する必要がループや再帰

;WITH cTE AS 
(
    SELECT TOP 9 
     POWER(10, ROW_NUMBER() OVER (ORDER BY column_id)) AS divisor 
    FROM 
     sys.columns 
) 
SELECT 
    * 
FROM 
    myIntColumn 
    JOIN 
    cTE ON myIntColumn/divisor = 13 
4

です:

SELECT * FROM myTable WHERE convert(varchar, myIntColumn) like '13%' 

を考慮に入れないということこのクエリはおそらくmyIntColumnフィールドのインデックスの恩恵を受けることはありません。あなただけの検討のため

SELECT * FROM myTable WHERE myIntColumn like '13%' 

(それが原因LIKEに暗黙的に行われます)、明示的に列をキャストする必要はありません

+1

パフォーマンスが問題になる場合は、変換済みの値を含む表にvarchar列を追加することを検討してください。この列にインデックスを追加すると、少し余分なストレージを犠牲にしてクエリを高速化する必要があります。 – Ray

1

、あなたは速くなる可能性があり、同じ結果を達成するために数学を使用することができます

SELECT * FROM myTable 
WHERE myIntColumn/NULLIF(POWER(10,LEN(myIntColumn)-2),0) = 13