【问题标题】:Sql Server Split and ConcatenationSql Server 拆分和连接
【发布时间】:2011-08-01 22:35:32
【问题描述】:

我在 sql server 数据库表中有以下格式的数据

[CPOID]  [ContractPO]        [ContractPOTitle]
1        10-SUP-CN-CNP-0001  Drytech
2        10-SUP-CN-CNP-0002  EC&M

我需要写一个存储过程来生成如下结果

[CPOID]      [ContractPO]        [ContractPOTitle]   [ConcatField]
    1        10-SUP-CN-CNP-0001  Drytech            CNP-0001-Drytech            
    2        10-SUP-CN-CNP-0002  EC&M               CNP-0002-EC&M

其中 [ConcatField] 使用拆分 [ContractPOTitle] 列的最后两个值并与 [ContractPOTitle] 组合生成结果

【问题讨论】:

  • 请贴出你目前写的代码。人们通常不喜欢只为您编写代码。事实上,这是一个工作描述,而不是一个问题。
  • 另外,您可能需要指定数字的格式是否会发生变化,因为如果发生变化,您也需要为此做好计划。您可能需要阅读SubStringCharIndex 函数,因为这些函数将在您希望完成的任务中发挥重要作用。编辑:我忘记了Reverse 函数,你也应该熟悉这个函数

标签: sql sql-server split concatenation


【解决方案1】:

如果 ContractPO 字段的长度始终相同,您可以这样做:

SELECT 
    CPOID, 
    ContractPO, 
    ContractPOTitle, 
    RIGHT(ContractPO, 8) + '-' + ContractPOTitle as [ConcatField]
FROM MyTable

假设 ContractPO 字段的长度不是固定的,并且我们必须依靠剥离倒数第二个“-”之后的文本,下面的 SQL 将起作用。这有点难看,但这些类型的操作是必要的,因为 SQL Server 中似乎没有现成可用的 LASTINDEX 函数。

SELECT 
    CPOID, 
    ContractPO, 
    ContractPOTitle, 
    RIGHT(ContractPO, CHARINDEX('-', REVERSE(ContractPO), CHARINDEX('-', REVERSE(ContractPO)) + 1) - 1) + '-' + ContractPOTitle as [ConcatField]
FROM @myTable

【讨论】:

  • 您的代码假设 ContractPO 提交的格式不会改变,OP 需要告诉我们在 10-SUP-CN-CNP-9999 之后会发生什么,是下一个数字 10-SUP-CN-CNP -10000?如果是这样,这将导致您的解决方案中断。更好的方法是使用 SubString、CharIndex 和 Reverse。
  • @Mark 你是对的,我更新了我的答案以解析第二个'-'之后的文本。但是,只是想指出我确实用“如果 ContractPO 字段总是相同的长度”来限定我的第一个答案,因为 OP 没有指定。 =]
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2017-07-10
相关资源
最近更新 更多