4

を含む SQL サーバーでコード Access Query を直接実行しているときに問題が発生しましたVAL([CoLUMN_NAME])。たくさんグーグルした後、私はCAST(COLUMN AS DATATYPE)を置き換えることを見つけましたVAL()

しかし、その列がテキスト型の場合、書き込むとVAL([COLUMN_NAME])、そのテキストから数値部分のみが取得されます。たとえば、列の値は 45-A45 で、使用VAL([COLUMN_NAME])すると「4545」のみが取得されます。

これを SQL SERVER で達成したい場合、どうすればよいでしょうか?

4

1 に答える 1

9

Val は文字列の左側にある単なる数字なので、大まかに次のようなものから始めることができます。

SELECT CASE 
         WHEN Patindex('%[^0-9]%', table_1.atext) > 0 THEN Cast( 
         LEFT(table_1.atext, Patindex('%[^0-9]%', table_1.atext) - 1) AS INT) 
         ELSE 0 
       END AS Val 
FROM   table_1; 

これは「45 ダース」ではなく 45 を返しますが、「45」ではなく 45 を返すように大幅に改善する必要があります。

再コメントを編集

@Andriy Mのソリューション(以下)は、私が知る限り、Valとまったく同じように機能します。

  SELECT CAST(LEFT(table_1.atext, Patindex('%[^0-9]%', table_1.atext + 'x') - 1) 
  AS INT) AS Val from table_1 

編集#2

MS Access からの表:

AText   Val(Atext)  
45 dozen    45
ABC 45      0
45_ABC      45
45 ABC 34   45
45          45
ABC         0

@Andriy M のソリューションを使用すると、まったく同じ結果が得られます。

それ以来、@GMastros の方が優れた解決策があることがわかりました。

CAST(LEFT(atext, Patindex('%[^-.0-9]%', atext + 'x') - 1) AS Float) AS Val

検索パターンを変更して、マイナス記号と小数点記号を含めたことに注意してください。また、キャストのデータ型を float に変更しました。Val は vb6 double を返します。これは、SQL Server float と同じです。-- G.マストロス

于 2013-01-23T11:22:37.327 に答える