在存储过程之后获取数字

时间:2009-08-27 06:26:38

标签: sql sql-server tsql

我在table中有一个字段。假设它的值是2009/1234。我想在'/'之前得到数字。我想在sql中的存储过程中执行此操作。任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

假设您可以保证斜杠和数字将存在:

 SELECT SUBSTRING(myfield, CHARINDEX('/', myfield)+1, 1000) FROM mytable;

答案 1 :(得分:2)

正确这样做的方式(我认为,当然,因为“正确”是一个主观术语)将修改架构,以便将这些值分开。

换句话说,2009和1234将在不同的栏目中。

在速度和可伸缩性方面,在select语句中使用每行函数几乎总是一个坏主意。这是因为DBMS必须在提取的每个单行上执行计算,每次时提取它。

如果您需要将它们保留为单列,我过去使用的一个技巧是使用带有两个额外列的插入/更新触发器来接收部件,因此您将拥有:

SomeFields       |   Data    | PostSlash
-----------------+-----------+----------
blah, blah, blah | 2009/1234 | 1234

是的,我知道这不是理想的3NF,但如果你做得对,那么出于性能原因打破它是完全可以接受的。触发器将保证列始终匹配,您会发现您的查询运行速度更快,而且触发器和数据重复的成本最低。

但是,当创建或更新行而不是每次读取行时,最好分割一次。这是因为数据库的读取次数通常比写入的次数多。触发费用在所有选择中摊销。

请记住,如果您的表格较小或(出于某些奇怪的原因)写入的次数多于阅读次数,那么使用每行功能可能会更好。

答案 2 :(得分:1)

SUBSTRING(MyValue,CHARINDEX('/',MyValue)+ 1,8000)

答案 3 :(得分:1)

要获取斜杠之前的数字,假设斜杠始终存在:

SELECT LEFT(columnname, CHARINDEX('/', columnname, 1) - 1) FROM aTable