В Trino (ранее Presto) отсутствует часто используемая функция, доступная в Excel, Hive, Oracle, PLSQL, Db2, python,… вот довольно простой и эффективный способ решить эту проблему своими руками.

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

Было ли это полезно? Средство отлично. Подписка Medium была лучшими 5 долларами, которые я когда-либо тратил. Присоединяйтесь, и я получу небольшой бонус.

Примерная таблица

WITH 
name_table AS
(select ‘jordan lamborn’ as name)

name_table

+ — — — — — — — — +
| name            |
+ — — — — — — — — +
| jordan lamborn  |
+ — — — — — — — — +

Решено: как сделать первую букву каждого слова в Trino заглавной

Исходное значение varchar

'Иордан Ламборн'

Фрагмент кода

SELECT
(array_join((transform((split(name_table.name,’ ‘)), x -> concat(upper(substr(x,1,1)),substr(x,2,length(x))))),’ ‘,’’))
FROM  name_table

Результирующее значение

«Джордан Ламборн»

Как это работает

  1. Во-первых, функция split () с пробелом в качестве разделителя разбивает varchar на массив, содержащий каждое слово отдельно
    split (name_table.name, '') ›› [«jordan ”,” Lamborn ”]
  2. Затем мы воспользуемся функцией transform (), чтобы применить определенную обработку к каждому элементу нашего нового массива. Синтаксис преобразования работает так, что каждый элемент массива становится переменной x в нашей новой функции. Я думаю об этом как о цикле For в javascript.
    transform ((split (name_table.name, '')), x - ›(НАША НОВАЯ ФУНКЦИЯ ИДЕТ ЗДЕСЬ))
  3. Первая часть нашей пользовательской функции будет извлекать первый символ (подстрока позиции 1) слова x, а затем использовать его с заглавной буквы с помощью upper ()
    'j ordan' = x ›› верхний (substr (x, 1,1)) ›› 'J'
  4. Вторая часть нашей пользовательской функции снова извлечет оставшуюся часть слова, используя substr (), а также длину () x
    'j ordan' = x ›› ниже (substr ( x, 2, длина (x))) ›› 'ordan'
  5. Итак, теперь у нас есть «J» и «ordan» после того, как было дано «jordan». Мы можем соединить эти две строки вместе, чтобы получить «Jordan», что нам и нужно. Этот фрагмент просто выполняет шаги 3 и 4, указанные выше, и складывает их вместе с запятой между ними.
    concat (
    upper (substr (x, 1,1)), lower (substr (x, 2, длина (x)))
    )
  6. Помните, что все это происходит внутри transform (), но в результате остается массив. Мы перешли от [«jordan», «lamborn»] к J ordan», «L amborn»].
    (преобразование ((split (name_table.name, '')), x - ›concat (upper (substr (x, 1,1)), lower (substr (x, 2, длина (х))))))
  7. Функция array_join () позволит нам преобразовать наш массив в varchar. Нам просто нужно определить разделитель и нулевую замену. Разделителем будет тот же разделитель, который мы использовали для разделения varchar. Нулевое замещение будет пустым.
    array_join (КОД МАССИВА ШАГА 6, ‘‘, ’’)

Итак, независимо от того, сколько слов в каждой строке, transform () применит эту функцию конкатенации / подстроки к каждому слову и выдаст новый массив. Оттуда мы сжимаем массив обратно в varchar, используя array_join ().

Что вы думаете? Я хотел бы услышать твои мысли.

Требуется вдохновение для расстановки приоритетов или планирования? Ознакомьтесь с этим сумасшедшим списком из более чем 135 идей по расстановке приоритетов. Хотите узнать о Среднем или Среднем и SEO?