2008-08-20 36 views
2

私は簡単な比較を行うために数値に変換する文字列としてパーセント範囲を含むデータ列を持っています。文字列中のSQL文字列の範囲から数値を取得

可能な値:

'<5%' 
'5-10%' 
'10-15%' 
... 
'95-100%' 

私はその値を比較できるように、私はちょうど等の最初の数、5、10、15、に私のselect句でこれを変換したいです渡された "少なくともこれ"の値。

私は部分文字列、charindex、変換、置換のバリエーションを試しましたが、私はまだすべての組み合わせで動作するものを得ることができません。

アイデア?

答えて

5

SELECT substring(replace(interest , '<',''), patindex('%[0-9]%',replace(interest , '<','')), patindex('%[^0-9]%',replace(interest, '<',''))-1) FROM table1 

が私の最後でテストされ、それが動作しますが、これを試してみてください、それだけで私の最初の試みです。

+0

の場合、列の値がABCD2の場合は機能しません – Thunder

0

charデータを他のタイプのchar(char(10)からvarchar(10)に変換)に変換できますが、文字データをSQL内の整数データに変換することはできません。

0

これはSQL Serverで動作するのかわかりませんが、MySQLでは文字データを数字に変換するためにいくつかのトリックを使用できます。あなたのサンプルデータからの例:

"<5%"  => 0 
"5-10%" => 5 
"95-100%" => 95 

今、明らかに、これはあなたの最初のテストを失敗しますが、文字列の先頭にいくつかの巧妙な文字列の置換は、それが働いて取得するのに十分だろう。

番号に文字データを変換の一例:

SELECT "5-10%" + 0 AS foo ... 

は、SQL Serverで動作しない場合がありますが、将来の検索が奇数MySQLユーザ:-D

0

を助けるかもしれないあなたは、おそらくはるかに良いと思いますオフ<5%5-10%を変更して2つのフィールドに2つの値を格納します。 <5%を格納するのではなく、0と5を格納し、5-10%の代わりに5と10で終わるようにします.2つの列、lowerboundとupperboundという2つの列になり、値>=下位AND値<上限。あなたはそれを最適化することができるかもしれないので

0

これは、SQL Serverでカーソルを使用して実行できます。 CLR関数を作成して、役立つ番号のグループを引き出すことができます。 T-SQLで可能ですが、ちょうど醜いでしょう。

リストをループするカーソルを作成します。 最初の番号を見つけ、その中に1つの番号グループしかない場合は、それを返します。それ以外の場合は、2番目のアイテムのグループを見つけます。

最初の項目グループのみが返され、リストの最初の項目が上限に設定されている場合、 最初の項目グループのみが返され、リスト内の最後の項目が下限に設定されている場合。 は、そうでない場合は下にグループ化する第一の項目を設定し、上限

にグループ化する第2項目は、ちょうどあなたが持っている問題は、原子データを保持しないの症状であるバックテーブルに

0

を結果の値を設定します。この場合、それは純粋に意図的ではない(レガシー)に見えますが、ここではlinkです。 range_lookupテーブルを作成するには、この外に、自分自身を設計する

Create table rangeLookup(
    rangeID int -- or rangeCD or not at all 
    ,rangeLabel varchar(50) 
    ,LowValue int--real or whatever 
    ,HighValue int 
) 

ここにいくつかの擬似を自分自身をハックするには、これが深くネストされた混乱になります繰り返します。

normalize your input by replacing all your crazy charecters. 
    replace(replace(rangeLabel,"%",""),"<","") 
    --This will entail many nested replace statments. 

Add a CASE and CHARINDEX to look for a space if there is none you have your number 
    else use your substring to take everything before the first " ". 
    -- theses steps are wrapped around the previous step. 
2

@Martin:ソリューションは機能します。ここで

は、私はそれは複雑だ

select cast(replace(replace(replace(interest,'<',''),'%',''),'-','.0') as numeric) test 
from table1 where interest is not null 
0

@mercutioからインスピレーションをもとに思い付いた別のですが、あなたが提供されるテストケースのために、これは動作します。 @Testをテーブルから探している列に置き換えてください。

DECLARE @TEST varchar(10) 

set @Test = '<5%' 
--set @Test = '5-10%' 
--set @Test = '10-15%' 
--set @Test = '95-100%' 

Select CASE WHEN 
Substring(@TEST,1,1) = '<' 
THEN 
0 
ELSE 
CONVERT(integer,SUBSTRING(@TEST,1,CHARINDEX('-',@TEST)-1)) 
END 
AS LowerBound 
, 
CASE WHEN 
Substring(@TEST,1,1) = '<' 
THEN 
CONVERT(integer,Substring(@TEST,2,CHARINDEX('%',@TEST)-2)) 
ELSE 
CONVERT(integer,Substring(@TEST,CHARINDEX('-',@TEST)+1,CHARINDEX('%',@TEST)-CHARINDEX('-',@TEST)-1)) 
END 
AS UpperBound 
関連する問題