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

Hem*_*mar 3 ms-access sql-server-2008

我在包含的sql server中直接运行代码Access Query时遇到了问题VAL([CoLUMN_NAME]).谷歌搜索后我找到了一个CAST(COLUMN AS DATATYPE)替换VAL().

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

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

Fio*_*ala 8

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; 
Run Code Online (Sandbox Code Playgroud)

这将返回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 
Run Code Online (Sandbox Code Playgroud)

编辑#2

MS Access表:

AText   Val(Atext)  
45 dozen    45
ABC 45      0
45_ABC      45
45 ABC 34   45
45          45
ABC         0
Run Code Online (Sandbox Code Playgroud)

使用@Andriy M的解决方案可以获得完全相同的结果.

我发现@GMastros有更好的解决方案

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

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