Sql 从块中选择一个单词

Sql 从块中选择一个单词,sql,sql-server,Sql,Sql Server,我有一个像546 Ave 13 units这样的地址,试试这个: select right('546 Ave 14 unit' , charindex(' ' , '546 Ave 14 unit' , charindex(' ','546 Ave 14 unit')) + charindex(' ','546 Ave 14 unit')-1) 其背后的逻辑如下: ch

我有一个像546 Ave 13 units这样的地址,试试这个:

select right('546 Ave 14 unit'
             , charindex(' ' , '546 Ave 14 unit'
                         , charindex(' ','546 Ave 14 unit'))
                         + charindex(' ','546 Ave 14 unit')-1)
其背后的逻辑如下:

charindex('','546 Ave 14 unit')
这将为您提供第一个空格的位置。
charindex(''546 Ave 14 unit',charindex(''546 Ave 14 unit'))
这将为您提供第二个空格的位置。
-1
i,因此它不考虑该空格。 而
right
函数将为您提供字符串中某个索引之后的字符串,我们通过查找第二个空格的索引找到了该索引所在的位置

还有另一种选择:

select parsename(replace('546 Ave 14 unit',' ','.'),1)  
       + ' ' 
       + parsename(replace('546 Ave 14 unit',' ','.'),2)
parsname
将从rihght开始返回“.”后面的零件。所以parsname('word1.word2',1)将返回word2,parsname('word1.word2',2)将返回word2。这就是为什么我们在使用parsname函数之前先使用
replace
函数将空格替换为句号的原因。

如果它总是以“[number]unit”结尾,您可以这样做

declare @text varchar(64)
set @text = '546 Ave 14 unit'

select RIGHT(@text,PATINDEX ('%[0-9] %' , Reverse(@text)))

但是您的需求还不清楚

您确实需要正则表达式来正确处理这个问题,而SQL Server(可能是您的数据库)并不真正支持这个问题。您可能希望在SQL Server之外处理此问题,然后重新导入数据。
replace(_列,'546 Ave','')
?预期结果与示例数据不匹配,或者?(546大街14单元=>13单元?)没有街道或林荫道?总是三位数吗?样本数据也应该包括棘手的案例。否则,您可能会得到一个适用于简单情况的查询,但在以后的生产过程中会失败。