Функция T-SQL для преобразования чисел в слова? - PullRequest
0 голосов
/ 31 августа 2018

Я изо всех сил пытаюсь создать функцию, которая может преобразовать число 0-9 в строке в ее орфографическое слово. Вот что я имею до сих пор, и я понимаю, что «слово» не является встроенным преобразованием, это просто то, что мои мысли о том, как это построить, будут:

CREATE FUNCTION [dbo].[fn_Numbers2Words]
    (@strText VARCHAR(1000))
RETURNS varchar(1000)
AS
BEGIN
    WHILE PATINDEX('%[0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[0-9]%', @strText), 1, CONVERT(word, PATINDEX('%[0-9]%', @strText)))
    END
    RETURN @strText
END

Идея состоит в том, чтобы ввести что-то вроде этого:

  SELECT [dbo].[fn_Numbers2Word]('1900testnumber')

и верните это:

  'oneninezerozerotestnumber'

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

Может ли кто-нибудь помочь мне изменить вышеуказанную функцию, чтобы она давала желаемый результат?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Грубая сила с CHOOSE:

Возвращает элемент по указанному индексу из списка значений в SQL Server.

DECLARE @num INT = 20;

SELECT CHOOSE(@num,
'one ',
'two ',
'three ',
'four ',
'five ',
'six ',
'seven ',
'eight ',
'nine ',
'ten',
'eleven ',
'twelve ',
'thirteen ',
'fourteen ',
'fifteen ',
'sixteen ',
'seventeen ',
'eighteen ',
'nineteen ',
'twenty',
'twenty-one ',
'twenty-two ',
'twenty-three ',
'twenty-four ',
'twenty-five ',
'twenty-six ',
'twenty-seven ',
'twenty-eight ',
'twenty-nine ',
'thirty',
'thirty-one ',
'thirty-two ',
'thirty-three',
'thirty-four ',
'thirty-five ',
'thirty-six ',
'thirty-seven ',
'thirty-eight ',
'thirty-nine ',
'forty',
'forty-one ',
'forty-two ',
'forty-three ',
'forty-four ',
'forty-five ',
'forty-six ',
'forty-seven ',
'forty-eight ',
'forty-nine ',
'fifty',
'fifty-one ',
'fifty-two ',
'fifty-three ',
'fifty-four ',
'fifty-five ',
'fifty-six ',
'fifty-seven ',
'fifty-eight ',
'fifty-nine ',
'sixty',
'sixty-one ',
'sixty-two ',
'sixty-three ',
'sixty-four ',
'sixty-five ',
'sixty-six ',
'sixty-seven ',
'sixty-eight ',
'sixty-nine ',
'seventy',
'seventy-one ',
'seventy-two ',
'seventy-three ',
'seventy-four ',
'seventy-five ',
'seventy-six ',
'seventy-seven ',
'seventy-eight ',
'seventy-nine ',
'eighty',
'eighty-one ',
'eighty-two ',
'eighty-three ',
'eighty-four ',
'eighty-five ',
'eighty-six ',
'eighty-seven ',
'eighty-eight ',
'eighty-nine ',
'ninety',
'ninety-one ',
'ninety-two ',
'ninety-three ',
'ninety-four ',
'ninety-five ',
'ninety-six ',
'ninety-seven ',
'ninety-eight ',
'ninety-nine'
)

Демоверсия DBFiddle

0 голосов
/ 31 августа 2018

Просто для удовольствия, вот еще один вариант, который вы можете включить в функцию

* ** 1003 тысяча два * Пример
Declare @S varchar(max) = '1900testnumber'

Select @S = replace(@S,sFrom,sTo)
 From (values ('0','zero')
             ,('1','one')
             ,('2','two')
             ,('3','three')
             ,('4','four')
             ,('5','five')
             ,('6','six')
             ,('7','seven')
             ,('8','eight')
             ,('9','nine')
      ) A(sFrom,sTo)

Select @S

Returns

oneninezerozerotestnumber
0 голосов
/ 31 августа 2018

Так как вы просто хотите простую замену, тогда использование вложенной замены будет супер сумасшедшим, быстрым и простым. Я бы не использовал здесь скалярную функцию.

declare @strText varchar(1000) = '1900testnumber'

select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@strText, '1', ' one'), '2', 'two'), '3', 'three'), '4', 'four'), '5', 'five'), '6', 'six'), '7', 'seven'), '8', 'eight'), '9', 'nine'), '0', 'zero')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...