使用LEN()将值传递给RIGHT()

时间:2013-04-03 13:43:53

标签: tsql

我有一个包含[工作电话](nvarchar)列的表。使用此数据库的软件允许用户输入任何字符,因此很多列包含“ 555-555-5555 Ext.1234 Bob Jones ”之类的内容。我唯一需要的是数字,我打算将Phone和Ext拆分成单独的列。在运行一个功能和其他一些东西后,我只需要电话和分机号码。所有空格和字母均已删除(例如55555555551234)。

我试图分割这个的方式,我首先要通过计算字段中的字符总数来获取扩展名(在我的示例中 14 ),然后减少数字10(电话号码中的字符总数(国家/地区代码除外))。因为扩展名可以是1-5个字符之间的任何地方,所以我试图使用LEN()来计算这个数,然后将它减少10个。

SELECT RIGHT([Table].[Column], LEN([Table].[Column]) -10)
FROM [Table]

我得到的是“传递给RIGHT函数的长度参数无效。”

我不完全理解这个问题,因为我只是做了类似的事情:

SELECT LEN([Table].[Column]) -10
SELECT LEN('55555555551234') -10

我按预期得到了值4。

将此参数传递给RIGHT的正确方法是什么,这样我就能得到我想要的东西(或者只是有更好的方法)?

4 个答案:

答案 0 :(得分:2)

表中的所有项目都大于或等于10?

SELECT RIGHT(55555555551234, LEN(55555555551234) -10)
SELECT RIGHT(5555555555, LEN(5555555555) -10)
SELECT RIGHT(55555555, LEN(55555555) -10)

尝试

SELECT  CASE WHEN LEN([Table].[Column)]) > 10
   THEN RIGHT([Table].[Column], LEN([Table].[Column]) - 10)
   END
   FROM    [Table]

答案 1 :(得分:0)

发生错误是因为减去10有时会带来负面影响。你需要在它周围加上一个case语句。

IE。

SELECT 
  RIGHT([TABLE].[Column], 
    CASE when LEN([TABLE].[Column])-10 >= 0 then 
        LEN([TABLE].     [Column])-10 
    ELSE LEN([TABLE].[Column]) 
    END) 
FROM [TABLE] 

当然,还有其他方法可以使用CASE,这只是一个例子来向您展示它出错的地方;)

答案 2 :(得分:0)

根据字符串模式,您可以使用PARSENAME将其分解

DECLARE @foo varchar(100) = '555-555-5555 Ext. 1234 Bob Jones';
SELECT @foo = REPLACE(REPLACE(REPLACE(@foo, 'Ext.', ' '), '  ', ''), ' ', '.');
SELECT
    @foo,
    PARSENAME(@foo, 1),
    PARSENAME(@foo, 2),
    PARSENAME(@foo, 3),
    PARSENAME(@foo, 4)

这取决于名称部分的构造方式

答案 3 :(得分:0)

您可以尝试使用STUFF函数获取扩展名:

SELECT STUFF('55555555551234',1,10,'')

它也适用于较短的字符串。