"Склеить" ФИО

Автор гость из Access, 27 апреля 2015, 15:31

0 Пользователи и 1 гость просматривают эту тему.

гость из Access

строка SELECT "Ф" + ' ' + "И" + ' ' + "О" FROM ... работает только когда все данные в наличии, иначе возвращается пустая строка, а Отчества может и не быть (пример: Мао Цзедун ;))
Амперсанд же для склейки строки, тут как будто не применяется? Ругается программа на него.

JohnSUN

Для замены значения NULL на пустую строку используется функция IFNULL(<выражение>, <значение для NULL> )
Для конкатенации строк в запросе используется функция CONCAT(str1,str2) или оператор ||
Функция CONCAT не очень удобная, всего два параметра - для ФИО пришлось бы писать цепочку вложенных вызовов:
SELECT CONCAT( CONCAT( IFNULL( "Ф", '' ), ' ' ), CONCAT( CONCAT( IFNULL( "И", '' ), ' ' ), IFNULL( "О", '' ) ) ) "ФИО" FROM ...
Оператор || лаконичнее:
SELECT IFNULL( "Ф", '' ) || ' ' || IFNULL( "И", '' ) || ' ' || IFNULL( "О", '' ) "ФИО" FROM ...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

#2
Может быть в данном случае подойдёт установка пробела в качестве значения по умолчанию для поля?
Это работает, вопрос не помешает ли пробел в дальнейшем.

Ильдар

Цитата: JohnSUN от 27 апреля 2015, 14:00Для замены значения NULL на пустую строку
Подскажите пожалуйста, как использовать TRIM? Пытаюсь, не получается...

JohnSUN

Если именно TRIM(), то
TRIM(BOTH FROM "Поле")
Можно использовать комбинацию
LTRIM(RTRIM("Поле"))
Ctrl+F и слово TRIM на этой странице
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Ильдар

Цитата: JohnSUN от 22 октября 2015, 13:09
Если именно TRIM(), то
TRIM(BOTH FROM "Поле")
Можно использовать комбинацию
LTRIM(RTRIM("Поле"))
Ctrl+F и слово TRIM на этой странице
Спасибо! Ваши ответы помогают освоить Базу.
А можно так же, наподобие с IFNULL связывать запросы с пустыми полями???
Например, по клиенту есть много разных таблиц: телефоны, адреса... но если одна из таблиц не заполнена, то запрос будет нулевым. Это можно избежать без значений по умолчанию???

JohnSUN

Для таких случаев используется "левое объединение" таблиц (LEFT OUTER JOIN).
Если "на пальцах", то выбираются нужные данные из основной таблицы, а потом справа к ним строка за строкой дописываются данные из сопутствующей. Если данных в сопутствующей таблице найдено не будет, то строка все равно выведется, но поля будут содержать NULL.

Обычно, по умолчанию, используется "внутреннее объединение" (INNER JOIN) - в результат запроса попадут только записи, для которых найдены данные в обеих таблицах. Такое объединение записывается или как INNER JOIN, или как условие 
...WHERE "Таблица1"."Код"="Таблица2"."КодВТаблице1"
Результат одинаков.

В мастере запросов тип связи между таблицами можно установить, если выделить линию связи и из контекстного меню выбрать Правка...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне