我有一个包含[工作电话](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的正确方法是什么,这样我就能得到我想要的东西(或者只是有更好的方法)?
答案 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,'')
它也适用于较短的字符串。