14

我需要提取连字符右侧的所有字符作为选择语句的一部分。选择中还会有其他列。在下面的查询中,右边的三个字符是从第二列中选择的。如何在分隔符右侧提取无限数量的字符 - 在我的情况下是连字符?我可以使用正确的功能吗?我需要使用其他功能吗?

Select column1, right(column2,3) as extracted, column3
From myTable

我正在使用 SQL Server 2008。

4

2 回答 2

32

这个问题有一个特定于数据库的答案。

如果使用 SQL Server:

SELECT column1
     , RIGHT(column2,CHARINDEX('-',REVERSE(column2))-1) as extracted
     , column3 
FROM myTable

如果连字符并不总是存在,您可以添加CASE语句或使用:NULLIF()

SELECT column1
     , CASE WHEN column2 LIKE '%-%' THEN RIGHT(column2,CHARINDEX('-',REVERSE(column2))-1) 
           END as extracted
     , column3 
FROM myTable

或者:

SELECT column1
     , RIGHT(column2,NULLIF(CHARINDEX('-',REVERSE(column2)),0)-1) as extracted
     , column3 
FROM myTable

如果使用 MySQL,只需更改CHARINDEX()LOCATE(). 我相信它是 OracleINSTR()并且前两个参数已切换,首先是您要搜索的字符串,然后是您要搜索的字符串。

于 2013-09-25T13:48:44.647 回答
1

怎么样:

SUBSTRING(column2, CHARINDEX('-',column2)+1, 8000)

(将 8000 替换为列的定义。)

当然,如果列可能并不总是包含连字符,那么您可以说:

SUBSTRING(column2, COALESCE(NULLIF(CHARINDEX('-',column2)+1,1),1),8000)

如果该列不包含连字符,您将获得整列。如果要从结果中排除这些,可以添加一个WHERE子句:

WHERE CHARINDEX('-', column2) > 0

或者您可以使用CASE像 Goat CO's answer 这样的表达式。

于 2013-09-25T14:09:00.483 回答