我有在直接在SQL Server中运行的代码访问查询包含一个问题VAL([CoLUMN_NAME])
很多谷歌搜索后,我发现一个CAST(COLUMN AS DATATYPE)
以取代VAL()
但是当该列是文本类型,如果我们写VAL([COLUMN_NAME])
我们只获得了数部分从该文本。 对于实施例列具有此值45-A45和使用VAL([COLUMN_NAME])
我们将得到唯一的“4545”。
如果我们想在SQL Server中实现这一目标怎么办?
我有在直接在SQL Server中运行的代码访问查询包含一个问题VAL([CoLUMN_NAME])
很多谷歌搜索后,我发现一个CAST(COLUMN AS DATATYPE)
以取代VAL()
但是当该列是文本类型,如果我们写VAL([COLUMN_NAME])
我们只获得了数部分从该文本。 对于实施例列具有此值45-A45和使用VAL([COLUMN_NAME])
我们将得到唯一的“4545”。
如果我们想在SQL Server中实现这一目标怎么办?
瓦尔只是数字的字符串的左边,所以你可以使用的东西开始很不客气,如:
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的解决方案(下)的作品完全一样瓦尔,据我可以告诉。
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
请注意,我改变了搜索模式,包括负号和小数点分隔符。 我也改变了数据类型的强制转换为浮动。 瓦尔返回VB6双,这是同为SQL Server浮动。 - G. Mastros