我需要提取连字符右侧的所有字符作为select语句的一部分。选择中将有其他列。在下面的查询中,从第二列中选择了右边的三个字符。如何在分隔符右侧提取无限数量的字符 - 在我的情况下是连字符?我可以使用正确的功能吗?我需要使用其他功能吗?
Select column1, right(column2,3) as extracted, column3
From myTable
我正在使用SQL Server 2008。
答案 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
表达式。