4

直接在包含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

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

于 2013-01-23T11:22:37.327 回答