2017-12-07 13 views
1

SQL Server内の小数ようなVARCHAR、私は照会しようとしていますx.numbersvarcharとして格納されていたと私はその場で持っている値の一部はクエリは、私はSQL Serverの問題を抱えている

です

where x.numbers >= '9' 

8.9 
9.3 
6.7 
>10 
8.3 
>= 9 

isnumeric(x.numbers)を試しても、>または> =で始まる値は除外されます。私はcast(x.numbers as decimal)を試しましたが、うまく機能しません。

where try_convert(decimal(38, 6), field) > 9 

、これは多くの状況のた​​めに働く、あなたが数値以外の値を無視することを前提としています。私はtry_convert()を使用する

+2

あなたは「いくつかのサンプルデータと結果あなたを投稿できる、それが増加/どちらか<または>を持つ値の値が減少します期待していますか? http://www.sqlservercentral.com/articles/Best+Practices/61537/ – Larnu

+0

7.9、4.5、9、> 10、6.7、11.7、> 12 – sam

+0

「> 10」と「> 12」は、値 '<= 10'は、**それらの値を除外する必要があると私は安全に仮定できますか? – Larnu

答えて

0

を教えてください。

あなたは、様々な「その他」の文字を取り除くために、これを変更することができます。

where try_convert(decimal(38, 6), replace(replace(replace(replace(field, ' ', ''), '=', ''), '>', ''), '<', '')) > 9 

これは、「演算子」の文字を無視します。

ただし、問題は不完全に指定されています。フィールドが'< 12'または'> 7'だった場合は、何を返すのですか?

+0

番号が7以上で、try_convertがSQLサーバーの組み込み関数ではありません – sam

+1

どのバージョンのSQL Serverを使用していますか? 'TRY_CONVERT'はSQL Server 2012で導入されました。はい、「組み込み関数」です。 :) – Larnu

+0

私は2008年を持っている、私は2012年をダウンロードする必要がありますか? – sam

1

これは私の試みです。それはかなりではありませんが、あなたがしているものを得るかもしれません。

CREATE TABLE #Sample (N varchar(5)); 
INSERT INTO #Sample 
VALUES ('7.9'),('4.5'),('9'),('>10'),('6.7'),('11.7'),('>12'),('<=10'),('<9'); 
GO 

SELECT * 
FROM #Sample; 
GO 
WITH CTE AS (
    SELECT *, 
      CASE WHEN N LIKE '>=%' OR N LIKE '<=%' THEN TRY_CONVERT(decimal(5,1),REPLACE(REPLACE(REPLACE(N,'>',''),'<',''),'=','')) 
       WHEN N LIKE '>%' THEN TRY_CONVERT(decimal(5,1),REPLACE(REPLACE(REPLACE(N,'>',''),'<',''),'=','')) + 0.1 --Adding .1 as it needs to be more than it's value 
       WHEN N LIKE '<%' THEN TRY_CONVERT(decimal(5,1),REPLACE(REPLACE(REPLACE(N,'>',''),'<',''),'=','')) - 0.1 
       ELSE TRY_CONVERT(decimal(5,1),N) 
      END AS Nr 
    FROM #Sample S) 
SELECT N 
FROM CTE 
WHERE Nr >= 9; 

GO 
DROP TABLE #Sample; 

--SQL 2008, just CONVERT 
WITH CTE AS (
    SELECT *, 
      CASE WHEN N LIKE '>=%' OR N LIKE '<=%' THEN CONVERT(decimal(5,1),REPLACE(REPLACE(REPLACE(N,'>',''),'<',''),'=','')) 
       WHEN N LIKE '>%' THEN CONVERT(decimal(5,1),REPLACE(REPLACE(REPLACE(N,'>',''),'<',''),'=','')) + 0.1 --Adding .1 as it needs to be more than it's value 
       WHEN N LIKE '<%' THEN CONVERT(decimal(5,1),REPLACE(REPLACE(REPLACE(N,'>',''),'<',''),'=','')) - 0.1 
       ELSE CONVERT(decimal(5,1),N) 
      END AS Nr 
    FROM #Sample S) 
SELECT N 
FROM CTE 
WHERE Nr >= 9; 
+0

私はここでは非常に大きなデータベースを持っていますが、ここではwhere節の値を調べてみたいと思います。また、TRY_CONVERTがSQLサーバーで動作していません – sam

+0

他のコメントを繰り返すには、どのバージョンのSQL Serverを使用していますか? 'TRY_CONVERT'がSQL Server 2012で導入されました.SQL Server <= 2008を使用している場合は、' CONVERT() 'を試すことができますが、私たちに与えていないシナリオがあれば動作しません。そして、WHERE句は 'WHERE Nr> = 9'だけですが、それよりもはるかに簡単にはできません! :) – Larnu

+0

'TRY_CONVERT'ではなく' CONVERT'を使って(2008)バージョンを追加しました。エラーが発生した場合は、より多くのサンプルデータで質問を更新し、エラーを生成しているものを表示する必要があります。 – Larnu

0

トライキャスト(nはフロートなど)は、以下に示すように:

 create table #tmp(numbers varchar(10)) 

     insert into #tmp values('8.9') 
     insert into #tmp values('9.3') 
     insert into #tmp values('6.7') 
     insert into #tmp values('11') 
     insert into #tmp values('8.3') 
     insert into #tmp values('9') 
     insert into #tmp values('10') 


     Select * from #tmp where cast(numbers as float)> = cast('9' as float) 

     Drop table #tmp 
関連する問題