我在包含VAL([CoLUMN_NAME])
的sql server中直接运行代码Access Query时出现问题。谷歌搜索后我发现CAST(COLUMN AS DATATYPE)
替换VAL()
。
但是当该列是文本类型时,如果我们写VAL([COLUMN_NAME])
,我们只得到该文本中的数字部分。例如,该列的值为45-A45,使用VAL([COLUMN_NAME])
,我们只得到“4545”。
如果我们想在SQL SERVER中实现这个怎么办?
答案 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