2016-04-12 3 views
3

Я хочу сделать запрос, который показывает мне last_name с заглавной буквой с первой буквой, а также с последней заглавной.SQL капитализировать первую и последнюю букву имени

Пример: last_name = 'Alexander' после запроса: last_name = 'АЛЕКСАНДР'

Я попытался как этот

select initcap(last_name)+LOWER(SUBSTR(last_name,2,LENGTH(last_name))) name_last from employees 

, но я получаю эту ошибку 01722. 00000 - "неверный номер"

Я использую SQL Oracle DB

Может кто-нибудь объяснить мне, в чем проблема?

+3

Используйте '||' для конкатенации строк в Oracle, а не '+'. –

+2

'SELECT initcap (reverse (initcap (reverse (last_name))))' если вы чувствуете себя глупо :-) – Jeroen

+0

как я могу использовать последнее письмо? –

ответ

7

Проблема заключается в характере конкатенации. Тем не менее, я хочу предложить несколько иной подход:

select (upper(substr(last_name, 1, 1)) || 
     substr(last_name, 2, len(last_name) - 2) || 
     upper(substr(last_name, -1, 1)) 
     ) 

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

+1

да, он отлично работает, спасибо, но вместо LEN в sql вы должны использовать LENGTH –

+0

можете ли вы рассказать мне, как я могу написать число с плавающей точкой, например комиссию, с нулевым заполнением справа Пример: комиссия_pct = 0,5 после запроса, комиссия_pct = 0.50000000 ? –

+0

Я нашел его DECODE (комиссия_pct, NULL, «NO COMMISSION», TO_CHAR (rpad (COMMISSION_PCT, 9, '0'))) comm –

1

Чтобы связать строку, в которой вы используете '+', которая рассматривает вашу строку, это число, которое не соответствует действительности, и вы получаете эту ошибку.

Чтобы объединить строки в Oracle, используйте либо || оператора или CONCAT().

Таким образом, ваш запрос становится как:

select initcap(last_name) || LOWER(SUBSTR(last_name,2,LENGTH(last_name))) name_last from employees; 

Теперь вы можете изменить это, чтобы получить вывод, который вы ожидаете.

Смежные вопросы