-1

I want to detect records from a table (SQL Server) if it has roman numerals.

Table has data as follows:

    Column A | Column B
-----------------------------
1            | AMC I XYZAQS
2            | ABC IV 2 XYZQWS
3            | ANR XVI ANCVP
4            | SWD POL 2#

So, the result will be the first 3 records

SChowdhury
  • 163
  • 1
  • 11

1 Answers1

0

What about this?

DECLARE @dummy TABLE(A INT,B VARCHAR(100));
INSERT INTO @dummy VALUES
 (1,'AMC I XYZAQS')
,(2,'ABC IV 2 XYZQWS')
,(3,'ANR XVI ANCVP')
,(4,'SWD POL 2#');

WITH Casted AS
(
    SELECT A
          ,B
          ,CAST('<x>' + REPLACE((SELECT B AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML) InParts
    FROM @dummy
)
,Splitted AS
(
    SELECT A
          ,B
          ,x.value('.','nvarchar(max)') AS part 
    FROM Casted
    OUTER APPLY InParts.nodes('x') AS Parts(x)
)
SELECT * FROM Splitted
WHERE UPPER(part) NOT LIKE '%[0-9ABEFGHJKNOPQRSTUWYZ]%' 

The result

A   B               part
1   AMC I XYZAQS    I
2   ABC IV 2 XYZQWS IV
3   ANR XVI ANCVP   XVI

This will not check any rules of roman numerals. It only checks for the existance of special characters

Shnugo
  • 66,100
  • 9
  • 53
  • 114
  • 1
    Nice approach, but the result also includes invalid sequences of numerals, such as 'ixv' – devio Feb 14 '17 at 11:24
  • 1
    @devio. That is my last line :-) Well, checking for such rules *with T-SQL* is cutting a bread with a chain saw... – Shnugo Feb 14 '17 at 11:26
  • 1
    @devio - I applied a udf to convert those "Part"s to decimal number system and ignored whenever the function did not return valid numeric value. This way we can filter the result one step ahead. – SChowdhury Feb 14 '17 at 21:10