我需要提取连字符右侧的所有字符作为选择语句的一部分。选择中还会有其他列。在下面的查询中,右边的三个字符是从第二列中选择的。如何在分隔符右侧提取无限数量的字符 - 在我的情况下是连字符?我可以使用正确的功能吗?我需要使用其他功能吗?
Select column1, right(column2,3) as extracted, column3
From myTable
我正在使用 SQL Server 2008。
我需要提取连字符右侧的所有字符作为选择语句的一部分。选择中还会有其他列。在下面的查询中,右边的三个字符是从第二列中选择的。如何在分隔符右侧提取无限数量的字符 - 在我的情况下是连字符?我可以使用正确的功能吗?我需要使用其他功能吗?
Select column1, right(column2,3) as extracted, column3
From myTable
我正在使用 SQL Server 2008。
这个问题有一个特定于数据库的答案。
如果使用 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()
并且前两个参数已切换,首先是您要搜索的字符串,然后是您要搜索的字符串。
怎么样:
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 这样的表达式。