【问题标题】:String concatenation based of column length基于列长度的字符串连接
【发布时间】:2017-12-20 10:44:28
【问题描述】:

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

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

需要的最终结果是扩展中的位数,并替换“电话”列的结束位数。

希望我的结果是:

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

我有 10 万条这样的记录。实现这一目标的最佳和快速方法是什么?谢谢。

【问题讨论】:

  • 电话和分机列的数据类型是什么?

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


【解决方案1】:

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

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

之所以有效,是因为 SUBSTRINGstart 参数的负参数允许您将字符串的结尾截断这些数量。


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

【讨论】:

    【解决方案2】:

    您可以将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;
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 2016-11-22
        • 2018-12-08
        • 2018-06-13
        相关资源
        最近更新 更多