直接在包含VAL([CoLUMN_NAME])
. 谷歌搜索了很多后,我找到了一个CAST(COLUMN AS DATATYPE)
替换VAL()
.
但是当该列是文本类型时,如果我们写入VAL([COLUMN_NAME])
,我们只会从该文本中获取数字部分。例如,该列的值是 45-A45,使用后VAL([COLUMN_NAME])
我们只会得到“4545”。
如果我们想在 SQL SERVER 中实现这一点怎么办?
直接在包含VAL([CoLUMN_NAME])
. 谷歌搜索了很多后,我找到了一个CAST(COLUMN AS DATATYPE)
替换VAL()
.
但是当该列是文本类型时,如果我们写入VAL([COLUMN_NAME])
,我们只会从该文本中获取数字部分。例如,该列的值是 45-A45,使用后VAL([COLUMN_NAME])
我们只会得到“4545”。
如果我们想在 SQL SERVER 中实现这一点怎么办?
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. 马斯特罗斯