基于列长度的字符串连接

时间:2017-12-20 10:44:29

标签: sql-server sql-server-2008 sql-server-2016

我在一张桌子上有这样的电话号码:

 ID   Telephone     extention
------------------------------
1    9986323422     4            
2    9992108        2222         
3    9962718        241

要求的最终结果是将采用延伸的数字并替换“电话”栏的结束数字/(s)。

希望我的结果是:

   ID   Telephone     extention   result
-----------------------------------------
1    9986323422     4           9986323424 
2    9992108        2222        9992222 
3    9962718        241         9962241 

我有100k这样的记录。实现这一目标的最佳和快捷方式是什么?感谢。

3 个答案:

答案 0 :(得分:1)

这可能有点太可爱 1 但是STUFF方法的替代方案:

SELECT ID,Telephone,Extension,
   SUBSTRING(Telephone,1-LEN(Extension),LEN(Telephone)) + Extension as Result

它的工作原理是因为SUBSTRING start 参数的负参数允许您按字符串截断字符串的结尾。

1 它避免重复调用LEN(),但优化器应该能够避免重复并避免必须反转整个字符串,但这确实是以可读性为代价的。

答案 1 :(得分:0)

您可以将STUFF()LEN()

的某些计算结合使用
DECLARE  @dummyTable TABLE(ID INT,Telephone VARCHAR(100), extention VARCHAR(100));
INSERT INTO @dummyTable VALUES
 (1,'9986323422','4')            
,(2,'9992108','2222')        
,(3,'9962718','241');

SELECT *
      ,STUFF(t.Telephone,LEN(t.Telephone)-LEN(t.extention)+1,LEN(t.extention),t.extention) AS result
FROM @dummyTable AS t;

您可能需要添加一些验证以避免错误(例如,扩展的长度应小于电话号码)

答案 2 :(得分:0)

以类似的方式使用reverse()函数和stuff()函数将电话值的结束数字替换为扩展值

select *, reverse(stuff(reverse(Telephone), 1, len(extention), reverse(extention))) 
from table