我在直接在包含VAL([CoLUMN_NAME])
的sql服务器中运行代码访问查询时遇到问题。在谷歌搜索了很多之后,我找到了一种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.马斯特罗斯