【问题标题】:Extract characters to the right of a delimited value in a SELECT statement在 SELECT 语句中提取分隔值右侧的字符
【发布时间】:2013-10-01 03:35:37
【问题描述】:

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

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

我使用的是 SQL Server 2008。

【问题讨论】:

  • 我们正在查看哪个版本的 SQL?

标签: sql sql-server select delimiter


【解决方案1】:

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

如果使用 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() 并且前两个参数被切换,首先是您要搜索的字符串,然后是您要搜索的字符串。

【讨论】:

  • 我正在使用 SQL Server。我刚刚编辑了主题以包含它。感谢您的快速回复。
  • 我收到上述消息“长度参数无效”。它将 -1 解释为长度。如果我替换为正数,则查询有效。我可以让上述内容在未指定的长度下工作吗?
  • 当没有连字符时会发生这种情况,第二个查询就是为此构建的。
  • 尽管出现错误,但我得到了正确的结果集。我没有得到正数的错误。它似乎有效,但我不知道为什么会导致错误。
  • 是的,第二次查询没有报错。我应该知道的。再次感谢。
【解决方案2】:

怎么样:

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

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

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

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

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

WHERE CHARINDEX('-', column2) > 0

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

【讨论】:

  • 谢谢。列的定义是什么意思?你是说类型吗?
  • @user2525015 我的意思是长度。 VARCHAR(255)、VARCHAR(8000) 等
  • 这会导致错误“varchar 不是内置函数名”。我正在使用 SQL Server 2008。我最初忽略了包含它。我不知道这是否与错误有关。
  • @user2525015 抱歉,我不知道你在说什么。看看桌子的设计。 Column2 将是具有给定长度的 varchar 或 nvarchar。使用那个长度。我的答案中的代码不包含单词 varchar 所以我不知道您正在运行什么会产生该错误。
  • Select SUBSTRING(column2, COALESCE(NULLIF(CHARINDEX('-',column2)+1,1),1,50)) 导致错误“子字符串函数需要3个参数”。那是我应该发布的消息。在那之后,我确实将 varchar 扔在那里,这就是你的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2019-02-28
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多