SQLUSA.com
SQL SERVER 2008 GRAND SLAM
FREE TRIAL  CLICK HERE TO ORDER  SEARCH
SQL JOBS SQL Server Training Scripts JOB BANK
  SQL Server 2008 Training Scripts  
  SQL Server 2005 Training Scripts  
News SQL Server Articles SQL Format

How to find the longest common prefix of strings?

Execute the following Microsoft SQL Server 2008 T-SQL database scripts in Query Editor to demonstrate string functions, the use of UDF to find the longest common prefix and unique suffix of an array of strings.

-- T-SQL SUBSTRING usage example - string system function - LEFT, RIGHT, ASCII

SELECT ProductNumber,

       MiddleSubstring=SUBSTRING(ProductNumber,4,5),

       ASCIIValue = ASCII(SUBSTRING(ProductNumber,2,1))

FROM AdventureWorks2008.Production.Product

ORDER BY Name

/* ProductNumber  MiddleSubstring   ASCIIValue

....

      FR-M21S-48  M21S-             82

      FR-M21S-52  M21S-             82

      FW-M423     M423              87

      HB-M243     M243              66  .... */

------------

-- T-SQL string formatting - concatenation with +

DECLARE @SSN char(9) = '123456789'

SELECT SSN=LEFT(@SSN,3)+'-'+ SUBSTRING(@SSN,4,2)+'-'+ RIGHT(@SSN,4)

-- 123-45-6789

------------

-- SQL longest common prefix - QUICK SYNTAX - Recursive CTE - CROSS APPLY usage

;WITH cteSeq(Nbr)

     AS (SELECT 1

         UNION ALL

         SELECT Nbr + 1

         FROM   cteSeq  WHERE  Nbr < 64)

SELECT PrefixLength=MAX(Nbr)

FROM   cteSeq

       CROSS APPLY (SELECT DeltaCount = Count(DISTINCT Prefix)

                    FROM   (SELECT Prefix = (SUBSTRING(Name, 1, Nbr))

                            FROM   AdventureWorks2008.Production.Product

                            WHERE  Name LIKE ('Mount%')) X) Y

WHERE  DeltaCount = 1

-- 8

------------

-- SQL find longest common prefix - find unique suffix - substring

-- SQL longest common prefix of strings

USE tempdb;

-- Create and populate table with SELECT INTO

SELECT   ID,

         ProductName = Name,

         UniquePart = CONVERT(VARCHAR(64),'')

INTO     ProdPrefix

FROM     AdventureWorks2008.Production.Product p

         INNER JOIN (SELECT   ID = ROW_NUMBER()

                                     OVER(ORDER BY SUBSTRING(ProductNumber,1, 7)),

                              Prefix = SUBSTRING(ProductNumber,1, 7)

                     FROM     AdventureWorks2008.Production.Product

                     WHERE    ListPrice > 0

                     GROUP BY SUBSTRING(ProductNumber,1,7)

                     HAVING   COUNT(* ) > 2) x

           ON SUBSTRING(p.ProductNumber,1,7) = x.Prefix

ORDER BY ID

GO

SELECT TOP(10)* FROM ProdPrefix

GO

/*

ID    ProductName             UniquePart

1     Mountain-500 Black, 40 

1     Mountain-500 Black, 42 

1     Mountain-500 Black, 44 

1     Mountain-500 Black, 48 

1     Mountain-500 Black, 52 

2     Mountain-500 Silver, 40

2     Mountain-500 Silver, 42

2     Mountain-500 Silver, 44

2     Mountain-500 Silver, 48

2     Mountain-500 Silver, 52

*/

— SQL scalar-valued user-defined function

CREATE FUNCTION fnCommonPart (@ID int)

RETURNS VARCHAR(64)

AS

BEGIN

DECLARE @i tinyint = 0, @Members int, @Ret varchar(64)

DECLARE @Name TABLE ( Seq int identity(1,1), String varchar(64))

INSERT INTO @Name SELECT ProductName FROM ProdPrefix WHERE ID = @ID

SET @Members = @@rowcount

WHILE (1 < 2)

BEGIN

  SET @i = @i+1

  IF ((SELECT max(PartCount) FROM (SELECT PartCount=COUNT(*) FROM @Name

  GROUP BY LEFT(String,@i)) x)= @Members)

  CONTINUE

  ELSE BREAK

END

IF @i = 1 SET @Ret = ''

ELSE SET @Ret= (SELECT LEFT(String, @i-1) FROM @Name WHERE Seq=1)

RETURN (@Ret)

END

GO

SELECT dbo.fnCommonPart(1)

SELECT dbo.fnCommonPart(2)

UPDATE ProdPrefix

SET UniquePart = RTRIM(LTRIM(RIGHT(ProductName, len(ProductName)-

                 len(dbo.fnCommonPart(ID)))))

GO

SELECT TOP(10)* FROM ProdPrefix

GO

/*

ID    ProductName                   UniquePart

1     Mountain-500 Black, 40        40

1     Mountain-500 Black, 42        42

1     Mountain-500 Black, 44        44

1     Mountain-500 Black, 48        48

1     Mountain-500 Black, 52        52

2     Mountain-500 Silver, 40       40

2     Mountain-500 Silver, 42       42

2     Mountain-500 Silver, 44       44

2     Mountain-500 Silver, 48       48

2     Mountain-500 Silver, 52       52

*/

DROP TABLE tempdb.dbo.ProdPrefix

DROP FUNCTION dbo.fnCommonPart

------------

 

Order SQL 2008 GRAND SLAM Today!
SQLUSA.com Home Page
SQL Server Training at www.sqlusa.com.
SQL Server 2008 Video Training at www.sqlusa.com.
SQL Server 2005 Training Videos at www.sqlusa.com.
Microsoft SQL Server 2000 Training Videos at www.sqlusa.com.

FREE SQL & Business Intelligence / OLAP Short Videos on YOUTUBE.com

Microsoft Community Contributor 2011
Invest in Your SUCCESS!

Search SQLUSA FREE SQL Server Articles & FREE T-SQL Scripts


Copyright 2005-2011, SMI Corp. All Rights Reserved.

SQL Server 2012 is a program product of Microsoft Corporation.
SQL Server 2008 is a program product of Microsoft Corporation.
SQL Server 2005 is a program product of Microsoft Corporation.
SQL Server 2000 is a program product of Microsoft Corporation.