0

我有一个包含 [Work Phone] (nvarchar) 列的表。使用该数据库的软件允许用户输入任何字符,因此很多列都包含诸如“ 555-555-5555 Ext. 1234 Bob Jones ”之类的内容。我唯一需要的是数字,我打算将电话和分机分成单独的列。在运行一个函数和其他一些事情之后,我只剩下电话和分机号码了。所有空格和字母均已删除(例如 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

4 回答 4

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]
于 2013-04-03T13:52:21.853 回答
0

发生错误是因为减去 10 有时会返回负数。您将需要在其周围放置一个案例声明。

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,这只是一个示例,向您展示错误的位置;)

于 2013-04-03T13:59:32.597 回答
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)

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

于 2013-04-03T14:02:32.283 回答
0

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

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

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

于 2013-04-03T14:35:25.160 回答