Oto mały funkcja, która zrobi „kodowanie NATO” dla Ciebie:
CREATE FUNCTION dbo.NATOEncode (
@String varchar(max)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN (
WITH L1 (N) AS (SELECT 1 UNION ALL SELECT 1),
L2 (N) AS (SELECT 1 FROM L1, L1 B),
L3 (N) AS (SELECT 1 FROM L2, L2 B),
L4 (N) AS (SELECT 1 FROM L3, L3 B),
L5 (N) AS (SELECT 1 FROM L4, L4 C),
L6 (N) AS (SELECT 1 FROM L5, L5 C),
Nums (Num) AS (SELECT Row_Number() OVER (ORDER BY (SELECT 1)) FROM L6)
SELECT
NATOString = Substring((
SELECT
Convert(varchar(max), ' ' + D.Word)
FROM
Nums N
INNER JOIN (VALUES
('A', 'Alpha'),
('B', 'Beta'),
('C', 'Charlie'),
('D', 'Delta'),
('E', 'Echo'),
('F', 'Foxtrot'),
('G', 'Golf'),
('H', 'Hotel'),
('I', 'India'),
('J', 'Juliet'),
('K', 'Kilo'),
('L', 'Lima'),
('M', 'Mike'),
('N', 'November'),
('O', 'Oscar'),
('P', 'Papa'),
('Q', 'Quebec'),
('R', 'Romeo'),
('S', 'Sierra'),
('T', 'Tango'),
('U', 'Uniform'),
('V', 'Victor'),
('W', 'Whiskey'),
('X', 'X-Ray'),
('Y', 'Yankee'),
('Z', 'Zulu'),
('0', 'Zero'),
('1', 'One'),
('2', 'Two'),
('3', 'Three'),
('4', 'Four'),
('5', 'Five'),
('6', 'Six'),
('7', 'Seven'),
('8', 'Eight'),
('9', 'Niner')
) D (Digit, Word)
ON Substring(@String, N.Num, 1) = D.Digit
WHERE
N.Num <= Len(@String)
FOR XML PATH(''), TYPE
).value('.[1]', 'varchar(max)'), 2, 2147483647)
);
Funkcja ta będzie działać na nawet bardzo długie ciągi i wykonuje dość dobrze (uruchomiłem to na 100 000 znaków i powróciło w 589 ms). Oto przykład, w jaki sposób z niego korzystać:
SELECT NATOString FROM dbo.NATOEncode('LD-23DSP-1430');
-- Output: Lima Delta Two Three Delta Sierra Papa One Four Three Zero
ja celowo mu funkcję wycenione tabela więc może być wstawiane do zapytania po uruchomieniu go przed wielu wierszy na raz, wystarczy użyć CROSS APPLY
lub owinąć wyżej przykład w nawiasach, aby użyć go jako wartości w klauzuli SELECT
(możesz umieścić nazwę kolumny w pozycji parametru funkcji).
Można użyć 'funkcję substring' i zwiększyć wskaźnik start z charIndex pierwszego, drugiego, trzeciego trafienia i tak dalej. – jpw
@jpw Jak znaleźć charindex drugiego dash? –
@RaduGheorghiu Szukając myślnika w podłańcuchu zaczynającym się od charindexu pierwszego kreska + 1. – jpw