loading..
Русский    English
07:34
листать

Рекурсивные СТЕ стр. 2

Преобразовать текст в столбце таблицы таким образом, чтобы каждое слово начиналось с заглавной буквы.

Вот пример данных и требуемый результат:

name     rep
delta     Delta       
KSI PSI     Ksi Psi       
alfa beta gamma    zeta    Alfa Beta Gamma    Zeta       
ALfa and omegA     Alfa And Omega    

За небольшим числом исключений (среди которых можно упомянуть аббревиатуры и инициалы) можно считать, что слову внутри текста предшествует пробел. Это можно использовать в качестве критерия поиска нужных нам элементов текста. Предлагаю реализовать такой достаточно примитивный алгоритм:

1. Первую букву текста делаем прописной, а остальные - строчными.

2. Затем каждую конструкцию "пробел+буква" переводим в верхний регистр.

С первым пунктом алгоритма все просто:

Консоль
Выполнить
  1. SELECT name, UPPER(LEFT(name, 1)) + LOWER(SUBSTRING(name, 2, LEN(name) - 1)) rep
  2. FROM
  3. (SELECT 'ALfa and omegA' AS name
  4. UNION ALL SELECT 'alfa beta gamma    zeta'
  5. UNION ALL SELECT 'KSI PSI'
  6. UNION ALL SELECT 'delta'
  7. ) X;

name     rep       
ALfa and omegA     Alfa and omega       
alfa beta gamma zeta   Alfa beta gamma    zeta       
KSI PSI     Ksi psi       
delta     Delta    

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

Итак,

Консоль
Выполнить
  1. SELECT name, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  2. REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3. REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4. REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  5. REPLACE(REPLACE(rep, ' a', ' A'), ' b', ' B'), ' c', ' C'), ' d', ' D'),
  6. ' e', ' E'), ' f', ' F'), ' g', ' G'), ' h', ' H'), ' i', ' I'), ' j', ' J'), ' k', ' K'),
  7. ' l', ' L'), ' m', ' M')' n',' N'), ' o', ' O'), ' p', ' P'), ' q', ' Q'), ' r', ' R'),
  8. ' s', ' S'), ' t', ' T'), ' u', ' U'), ' v', ' V'),
  9. ' w', ' W'), ' x', ' X'), ' y', ' Y'), ' z', ' Z')
  10. FROM(
  11. SELECT name, UPPER(LEFT(name,1)) + LOWER(SUBSTRING(name, 2, LEN(name)-1)) rep
  12. FROM
  13. (SELECT 'ALfa and omegA' AS name
  14. UNION ALL SELECT 'alfa beta gamma    zeta'
  15. UNION ALL SELECT 'KSI PSI'
  16. UNION ALL SELECT 'delta'
  17. ) X
  18. ) Y;

Нетрудно догадаться, что следующий вариант будет использовать рекурсивный CTE.

Bookmark and Share
Страницы: 1 2 3
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
https://exchangesumo.com/obmen/EOS-EOS/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.