在SELECT语句中提取分隔值右侧的字符

时间:2013-09-25 13:45:43

标签: sql sql-server select delimiter

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

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

我正在使用SQL Server 2008。

2 个答案:

答案 0 :(得分:19)

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

如果使用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()即可。我相信Oracle是INSTR()并且前两个参数被切换,首先它是你正在搜索的字符串,然后是你要搜索的字符串。

答案 1 :(得分:1)

怎么样:

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

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

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

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

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

WHERE CHARINDEX('-', column2) > 0

或者您可以像Goat CO的回答一样使用CASE表达式。