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