2011-04-09 45 views
2

我有以下格式数据在SQL Server数据库表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]生成结果,并与[ContractPOTitle]

+3

请发布您迄今为止编写的代码。人们通常不喜欢只为你写代码。事实上,这是一个工作描述,而不是一个问题。 – 2011-04-09 03:36:15

+1

另外,您可能想要指定数字的格式化是否会发生变化,因为如果他们这样做,您也需要对此进行规划。您可能需要阅读[SubString](http://msdn.microsoft.com/zh-cn/library/ms187748.aspx)和[CharIndex](http://msdn.microsoft.com/zh-cn/ us/library/ms186323.aspx)的功能,因为这些功能将在您要完成的任务中发挥重要作用。编辑:我忘了[反向](http://msdn.microsoft.com/en-us/library/ms180040.aspx)函数,您应该熟悉此函数 – 2011-04-09 03:48:18

回答

3

合并如果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 
+0

您的代码假定ContractPO字段的格式OP将不得不告诉我们在10-SUP-CN-CNP-9999之后会发生什么,是下一个数字10-SUP-CN-CNP-10000?如果是这样,这将导致您的解决方案中断。更好的方法是使用SubString,CharIndex和Reverse。 – 2011-04-09 03:54:55

+1

@Mark你是对的,我更新了我的答案,在第二个' - '之后解析出文本。然而,只是想指出,我确实符合我的第一个答案,因为OP没有指定,所以“如果ContractPO字段总是相同的长度”。 =] – rsbarro 2011-04-09 04:01:50

+0

+1了不起的工作!我相信这应该适用于OP – 2011-04-09 05:35:36