2017-02-14 20 views
-2

Я хочу обнаружить записи из таблицы (SQL Server), если у нее есть римские цифры.Как найти, если запись имеет римские цифры в SQL Server?

Таблица содержит следующие данные:

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

Таким образом, результат будет первые 3 записи

+3

Как вы узнаете, является ли символ римской цифрой? 4-я запись в вашем примере имеет «L», которая также является римской цифрой, почему бы вам не выбрать ее? – HoneyBadger

+0

И какой язык? Являются ли 'LIV' римскими цифрами или просто слово« жизнь »на шведском языке? –

+0

Я буду считать это римской цифрой независимо от того, что она имеет реальный смысл на любом другом языке. – SChowdhury

ответ

0

Что об этом?

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]%' 

Результат

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

Это не будет проверять любые правила римских цифр. Он проверяет только наличие специальных символов

+1

Хороший подход, но результат также включает недопустимые последовательности цифр, такие как 'ixv' – devio

+1

@devio. Это моя последняя строка :-) Ну, проверка таких правил * с T-SQL * - это резка хлеба цепной пилой ... – Shnugo

+1

@devio - я применил udf для преобразования этих «частей» в систему с десятичным числом и игнорируется всякий раз, когда функция не возвращает действительное числовое значение. Таким образом, мы можем отфильтровать результат на один шаг вперед. – SChowdhury