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中实现这个怎么办?
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