2011-05-29 12 views
0

SQL Server 2008には、どの文字列が最初に来るのかを調べる文字列比較方法がありますか(ex 'abc'は 'abd'などの前にあります)?私は< =比較をする必要があります。SQL Server 2008での文字列の比較

答えて

4

<=が問題ありません。あなたが抱えている問題は、文字列の数値ソートを期待していることです。それは特別な処理なしでは機能しません。

A1ソート

文字列 - この順でソートA10の文字列を:a1と "A1" とのA10スタート両方のため

a1 
a10 
a2 
a3 
a4 
... 

です。

文字列なので、数値は意味がありません。 0-9のa-zを代用するとどうなるか見てみましょう:

ab 
aba 
ac 
ad 
ae 

なぜ結果が得られたのか分かりますか?辞書では、abaはacの前に来て、a10はa2の前に来ます。

問題を解決するには、列を2つに分割することをお勧めします.1つはchar、もう1つは数値です。不愉快な表現の中には正しい並べ替え順序が得られるかもしれませんが、絶対に選択肢がない限り、それはずっと悪い解決策です。

ここには1つの方法があります。それは合わないかもしれませんし、より効率的な方法かもしれませんが、私はあなたのすべてのデータがどのようなものか分かりません。

SELECT 
FROM Table 
WHERE 
    Col LIKE 'a%' 
    AND Substring(Col, Convert(int, PatIndex('%[^a-z]%', Col + '0'), 1000)) <= 10 

アルファ部分が常に1文字であれば、より簡単に行うことができます。数字の後ろに文字を置くことができれば、より多くのつぶやきが必要です。

また、列を別々のアルファベットと数字の部分に分割し、外側のクエリに条件を設定する派生テーブルを試すこともできます。

照合は、各文字列と文字ベースの列は文字が一緒にソートされる(ほとんどの場合とアクセントのために)、これは不等式演算の結果を変えることができるかを決定照合設定を有して注意してください。

SELECT * 
FROM Table 
WHERE Value <= 'abc' 

SELECT CASE WHEN Value <= 'abc' COLLATE Latin1_General_CS_AS_KS_WS THEN 1 ELSE 0 END 
FROM Table 

私が使用した照合では、大文字と小文字が区別され、アクセントに敏感です。

あなたはそのような使用可能なすべての照合を見ることができます:

SELECT * 
FROM ::fn_helpcollations() 
+0

@mwok:あなたのコメントに基づいて更新されました。 – ErikE

+0

文字列から一意の番号を生成する何らかの「ハッシュ」関数があるので、文字列の代わりにその値を比較できますか? – mwok

+0

@mwokは動作しません。私は自分の投稿を更新しました。 – ErikE

5

どのような状況でですか? <=はSELECT文で動作します。

+0

は、合意されました。さまざまな文字列照合の一覧は、http://msdn.microsoft.com/en-us/library/ms144250.aspxで提供されています – dsolimano

+0

SELECT * FROM ( SELECT 'a1' AS col1 UNION SELECT 'a2' UNION SELECT 'a3 'UNION SELECT' a10 'UNION SELECT'テスト ' )WHERE col1 <=' a10 '; 'a1'と 'a10'のみが得られます。 – mwok

+0

@mwok - アルファベット順に 'a2'と' a3'が 'a10'の後に来るからです。システムに数値を評価させたい場合は、文字列の構造が一貫していなければなりません。彼らはいつも一人のキャラクターで始まっていますか? – Thomas