Quantcast
Channel: SQLServerCentral » SQL Server 2014 » Development - SQL Server 2014 » Latest topics
Viewing all articles
Browse latest Browse all 3145

How to perform multiple STUFF

$
0
0
I have nvarchar data that looks like XXXXXX-XX-XX where X can be a character or a number. The problem is getting them to sort in a meaningful manner. For example, if I have the following test data...DECLARE @JobNum TABLE([JobNum] [NVARCHAR](14) NOT NULL);INSERT INTO @JobNum (JobNum) VALUES ('ABLobby-ABL-1') ,('ABLobby-ABL-2') ,('ABLobby-ABL-5') ,('ABLobby-ABL-10') ,('ABLobby-ABL-11') ,('ABLobby-ABL-15') ,('ABLobby-ABL-20') ,('001656-1-1') ,('001656-2-1') ,('001656-10-1') ,('001656-13-1') ,('001656-13-2') ,('001656-13-10') ,('001656-13-11')I get the following if I order by JobNum...(No column name) JobNum@JobNum 001656-10-1@JobNum 001656-1-1@JobNum 001656-13-1@JobNum 001656-13-10@JobNum 001656-13-11@JobNum 001656-13-2@JobNum 001656-2-1@JobNum HPLobby-HPL-1@JobNum HPLobby-HPL-10@JobNum HPLobby-HPL-11@JobNum HPLobby-HPL-15@JobNum HPLobby-HPL-2@JobNum HPLobby-HPL-20@JobNum HPLobby-HPL-5I have what I think is a pretty cool solution using two CROSS APPLY statements and it works great.SELECT JobNum.JobNum , SortJobNum FROM @JobNum AS JobNum CROSS APPLY (SELECT CASE WHEN CHARINDEX('-',JobNum.JobNum,CHARINDEX('-',JobNum.JobNum)+1) - CHARINDEX('-',JobNum.JobNum) = 2 THEN STUFF(JobNum.JobNum,CHARINDEX('-',JobNum.JobNum),1,'-000') WHEN CHARINDEX('-',JobNum.JobNum,CHARINDEX('-',JobNum.JobNum)+1) - CHARINDEX('-',JobNum.JobNum) = 3 THEN STUFF(JobNum.JobNum,CHARINDEX('-',JobNum.JobNum),1,'-00') WHEN CHARINDEX('-',JobNum.JobNum,CHARINDEX('-',JobNum.JobNum)+1) - CHARINDEX('-',JobNum.JobNum) = 4 THEN STUFF(JobNum.JobNum,CHARINDEX('-',JobNum.JobNum),1,'-0') ELSE JobNum.JobNum END AS zJobNum ) _CA1 CROSS APPLY (SELECT CASE WHEN LEN(zJobNum)-CHARINDEX('-',zJobNum,LEN(zJobNum)-5) = 1 THEN STUFF(zJobNum,CHARINDEX('-',zJobNum,LEN(zJobNum)-5),1,'-000') WHEN LEN(zJobNum)-CHARINDEX('-',zJobNum,LEN(zJobNum)-5) = 2 THEN STUFF(zJobNum,CHARINDEX('-',zJobNum,LEN(zJobNum)-5),1,'-00') WHEN LEN(zJobNum)-CHARINDEX('-',zJobNum,LEN(zJobNum)-5) = 3 THEN STUFF(zJobNum,CHARINDEX('-',zJobNum,LEN(zJobNum)-5),1,'-0') ELSE JobNum.JobNum END AS SortJobNum ) _CA2ORDER BY SortJobNumWith result..JobNum SortJobNum001656-1-1 001656-0001-0001001656-2-1 001656-0002-0001001656-10-1 001656-0010-0001001656-13-1 001656-0013-0001001656-13-2 001656-0013-0002001656-13-10 001656-0013-0010001656-13-11 001656-0013-0011HPLobby-HPL-1 HPLobby-0HPL-0001HPLobby-HPL-2 HPLobby-0HPL-0002HPLobby-HPL-5 HPLobby-0HPL-0005HPLobby-HPL-10 HPLobby-0HPL-0010HPLobby-HPL-11 HPLobby-0HPL-0011HPLobby-HPL-15 HPLobby-0HPL-0015HPLobby-HPL-20 HPLobby-0HPL-0020The problem is I need to move the query into our business system and it does not allow a CROSS APPLY, nor can I use a CTE so basically I need to perform to STUFF operations based on two different criteria in a single CASE statement. Or is there a better way? I also can't perform a SELECT statement as a line in a query. Screwy, I know, but those are my limitations. Any help will be greatly appreciated.

Viewing all articles
Browse latest Browse all 3145

Trending Articles