对于MS Access的VAL()函数,我们在SQL SERVER中是否有任何等效函数?

时间:2013-01-23 09:02:35

标签: sql-server-2008 ms-access

我在包含VAL([CoLUMN_NAME])的sql server中直接运行代码Access Query时出现问题。谷歌搜索后我发现CAST(COLUMN AS DATATYPE)替换VAL()

但是当该列是文本类型时,如果我们写VAL([COLUMN_NAME]),我们只得到该文本中的数字部分。例如,该列的值为45-A45,使用VAL([COLUMN_NAME]),我们只得到“4545”。

如果我们想在SQL SERVER中实现这个怎么办?

1 个答案:

答案 0 :(得分:7)

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
  

请注意,我更改了搜索模式以包含负号   和小数分隔符。我还将强制转换的数据类型更改为   一个浮子。 Val返回一个vb6 double,它与SQL Server相同   浮动。 - G. Mastros