【问题标题】:SQL Server display only selected text from text with - not workingSQL Server 仅显示来自文本的选定文本 - 不起作用
【发布时间】:2018-07-25 02:59:01
【问题描述】:

在原始数据库中,列的行文本类似于 PA-PB-PC,我想在执行选择查询时只选择 PB。

对此有什么建议吗?

Select Section 
from Department  

预期的解决方案是在执行选择查询时仅显示中间文本“PB”

【问题讨论】:

  • PB总是在同一个索引吗?还是总是在第一个 - 之后,下一个之前?建议你看看 substring 可能还有 charindex
  • 很少,例如:PA-PB-PC、PA-PCA-PZ、PA-PXA-PXX,我在 vb.net 中使用 split("-")(1) 来让它显示中间文本,但是当我对文本进行单元格合并时,它不适用于 PB 与 PB 合并,PCA 与 PCA 合并导致第三个文本的初始值不同。
  • 将来,不要只提供一个示例并假设我们会读懂您的想法,而是尝试提供代码需要实现的实际规则。例如,您可能会说“文本包含三个由 '-' 字符分隔的子字符串,我只需要检索第二个子字符串”。如果您自己理解它们,解释这些事情并不难,如果您不理解它们,您可能需要在发布之前获得这种理解。

标签: sql sql-server vb.net


【解决方案1】:

您可以使用几种方法:

示例

declare @var varchar(64) = 'PA-PB-PC '

select 
    left(substring(@var,charindex('-',@var) + 1 ,99),charindex('-',substring(@var,charindex('-',@var) + 1 ,99)) - 1)

所以对于您的专栏...

select 
    Section = left(substring(Section,charindex('-',Section) + 1 ,99),charindex('-',substring(Section,charindex('-',Section) + 1 ,99)) - 1)
from Department  

这是基于您要显示 middle 文本的语句,并且您的示例有 3 个段。

另一种更简单的方法是使用parsename

declare @var varchar(64) = 'PA-PB-PC '

select 
    Section = parsename(replace(@var,'-','.'),2)

所以对于你的桌子:

select 
    Section = isnull(parsename(replace(Section,'-','.'),2),Section)
from Department  

【讨论】:

  • 您好,感谢您的快速响应,但它在我的 sql server management studio 上不起作用 =(
  • 你需要更具体的@Kit,SSMS 的版本应该没关系。
  • 好的,我再试一次,或者这种情况有更好的解决方案吗?很少,例如:PA-PB-PC、PA-PCA-PZ、PA-PXA-PXX,我在 vb.net 中使用 split("-")(1) 使其显示中间文本,但是当我对文本进行单元格合并时,它不适用于 PB 与 PB 合并,PCA 与 PCA 合并导致第三个文本的初始值不同。
  • 我帖子中的最后一个查询将是理想的...除非您说这些值都在一行中?
  • 是的,你的最后一个查询解决了我的问题,只是留下了另一个问题,我有一行没有 - 显示空值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 2016-01-14
相关资源
最近更新 更多