获取数字后/存储过程

问题描述:

我有一个字段在table.Suppose它的值是2009/1234.我想在'/'之前获得数字我想在存储过程中做这个sql.Can任何人都可以帮助?获取数字后/存储过程

+0

标题说的是一套,而queston另一... – Guffa 2009-08-27 07:30:24

SUBSTRING(myvalue的,CHARINDEX( '/',myvalue的)+ 1,8000)

假设你可以保证斜线和数字会存在:

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

如何让之前“/”数字? – user42348 2009-08-27 06:58:44

正确方式要做到这一点(在我看来,当然,因为“正确”是一个主观术语)将是修改模式,使这些值分开。

换句话说,2009年和1234年将在不同的列。

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

如果你需要他们保持作为一个单一的专栏中,我已经在过去使用的一个技巧是使用插入/更新触发器有两个额外的列接收部分,所以你会:

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

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

但是最好在创建或更新行时进行一次拆分,而不是每次读取它时都进行拆分。这是因为数据库通常比他们写的更多。触发费用在所有选择上摊销。请记住,如果您的表格较小或(出于一些奇怪的原因)书写比读取更频繁,那么使用每行功能可能会更好。

+0

很高兴看到看起来超出问题的人。是的,可以直接回答这个问题,但有时候,更多地考虑这个问题会揭示出潜在的合适的解决方案。 – belugabob 2009-08-27 07:00:11

为了斜线前得到的数字,假设斜线总是存在:

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