Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中获取以特定字符开头的字符串_Sql_Sql Server - Fatal编程技术网

如何在SQL Server中获取以特定字符开头的字符串

如何在SQL Server中获取以特定字符开头的字符串,sql,sql-server,Sql,Sql Server,我有一个表ABC,它有一列xyx,其中包含(888)477-8977x110或(888)477-8977 ext 110等值 如何在SQL Server中的x或ext之后获取值 SELECT REPLACE(column,'(888)','') FROM ABC; 或者使用子字符串 SELECT SUBSTRING(column,6,15) FROM ABC; 文件: 也许有点过分了 示例 Declare @YourTable Table ([Phone] varchar(50)) In

我有一个表
ABC
,它有一列
xyx
,其中包含
(888)477-8977x110
(888)477-8977 ext 110
等值

如何在SQL Server中的
x
ext
之后获取值

SELECT REPLACE(column,'(888)','') FROM ABC; 
或者使用子字符串

SELECT SUBSTRING(column,6,15) FROM ABC; 
文件:


也许有点过分了

示例

Declare @YourTable Table ([Phone] varchar(50))
Insert Into @YourTable Values 
 ('(888) 477-8977x110')
,('(888) 477-8977 ext 110')
,('(888) 477-8977 extention 110')
,('(888) 477-8977 e 110')
,('888.477.8977ext110')
,('(888) 477-8977')


Select * 
      ,Ext = ltrim(NullIf(reverse(ltrim(left(reverse(Phone),patindex('%[a-z]%',reverse(Phone)+'a')-1))),Phone))
 From  @YourTable
返回

Phone                           Ext
(888) 477-8977x110              110
(888) 477-8977 ext 110          110
(888) 477-8977 extention 110    110
(888) 477-8977 e 110            110
888.477.8977ext110              110
(888) 477-8977                  NULL

使用Charindex和子字符串

            DECLARE @word VARCHAR(254) = '(888) 477-8977 ext 110'
            SELECT  IIF(CHARINDEX('ext', @word) > 0, LTRIM(RTRIM(SUBSTRING(@word, 0,
                                                                          LEN(@word)
                                                                          - LEN(SUBSTRING(@word,
                                                                          CHARINDEX('ext',
                                                                          @word),
                                                                          LEN(@word)))))), LTRIM(RTRIM(SUBSTRING(@word,
                                                                          0,
                                                                          LEN(@word)
                                                                          - LEN(SUBSTRING(@word,
                                                                          CHARINDEX('x',
                                                                          @word),
                                                                          LEN(@word)))))))

如果您除了
x
ext
之外什么都没有,您可以走这条路:

DECLARE @tblPhoneNumber TABLE(ID INT IDENTITY, PhoneNumber VARCHAR(100));
INSERT INTO @tblPhoneNumber VALUES
 ('(888) 477-8977x110')
,('(888) 477-8977 ext 110');

SELECT LTRIM(RTRIM(
       CAST(
         '<x>' + REPLACE(REPLACE(PhoneNumber,'ext','x'),'x','</x><x>') + '</x>' AS XML
           ).value('/x[2]','nvarchar(max)')
       ))
FROM @tblPhoneNumber;
DECLARE@tblPhoneNumber表(ID INT-IDENTITY,PhoneNumber-VARCHAR(100));
插入到@tblPhoneNumber值中
(‘(888)477-8977x110’)
(‘(888)477-8977分机110’);
选择LTRIM(RTRIM(
铸造(
''+REPLACE(将(电话号码、'ext'、'x')、'x'、'')+''替换为XML
).value('/x[2]','nvarchar(max)'
))
来自@tblPhoneNumber;
首先,所有
ext
都将是
x
,然后所有
x
都将作为XML元素使用。

.value()
选择第二个元素,这是所需的元素。

您当然可以使用子字符串来完成此操作,但您的答案中的代码不会返回x或ext之后的值。我喜欢这种过度使用,它被称为防御:-D