2012-02-13 3 views
0

Мне нужна альтернатива implode для запросов mysql. После исследования найдены concat-функции.PHP implode альтернатива внутри mysql-запросов

Вопрос в том, могу ли я согласовать пробелы, подобные CONCAT_WS ('', sender.fname, sender.mname, sender.lname) AS sender_name? есть ли вероятность, что он даст ошибку, если одно из значений равно null?

Вот мой вопрос. более

SELECT message.id, message.from_id, message.to_id, message.subject, 
        message.date, message.deleted, message.read, 
        CONCAT_WS(' ',sender.fname, sender.mname, sender.lname) AS sender_name, 
        CONCAT_WS(' ',recipient.fname, recipient.mname, recipient.lname) AS recipient_name, 
        FROM msghistory AS message 
        LEFT JOIN users AS sender ON sender.id=message.from_id, 
        LEFT JOIN users AS recipient ON recipient.id=message.to_id 
        GROUP BY message.id DESC 

один вопрос, в этом CONCAT_WS запроса (»», recipient.fname, recipient.mname, recipient.lname) AS recipient_name не может быть найден (если нет соответствует строка в таблице пользователей). Это приведет к ошибке?

ответ

0

CONCAT_WS() не пропускает пустые строки. Тем не менее, он пропускает любые значения NULL после аргумента разделителя.

Это должно ответить на ваш вопрос.

+0

Еще один вопрос, в этом запросе CONCAT_WS ('', recipient.fname, recipient.mname, recipient.lname) Имя получателя AS может не быть найдено (если в таблице пользователей нет сопоставленной строки). Это приведет к ошибке? – heron

+0

Если строки не совпадают, функция не будет вызываться. Просто как тот. –

0

Несмотря на то, многословных, вам нужно использовать функцию COALESCE при работе с потенциалом для неприемлемых значений NULL:

CONCAT_WS(' ', COALESCE(val1, ''), COALESCE(val2, ''), ...) 

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

+0

Еще один вопрос, в этом запросе CONCAT_WS ('', recipient.fname, recipient.mname, имя_прибытия) AS имя_пользователя может не быть найдено (если в таблице пользователей нет соответствующей строки). Это приведет к ошибке? – heron

1

Да, вы можете использовать CONCAT_WS подобные. Если один из аргументов равен NULL, ошибки не будет. Аргумент NULL просто не используется.

Он говорит, что это в manual:

CONCAT_WS() не пропускает пустые строки. Тем не менее, он пропускает любые значения NULL после аргумента разделителя.

Это также очень легко проверить это для себя:

SELECT CONCAT_WS(' ', 'abc', NULL, 'def') 
'abc def' 
+0

Еще один вопрос, в этом запросе CONCAT_WS ('', recipient.fname, recipient.mname, имя_прибытия) AS имя получателя может не быть найдено (если в таблице пользователей нет соответствующей строки). Это приведет к ошибке? – heron

1

Да вы можете. Если будет ошибок не будет

+0

есть ли способ предотвратить это дополнительное пространство? – heron

+0

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

+0

Итак, 'SELECT CONCAT_WS ('', 'sth', 'sth', null, 'sth', null)' будет возвращать 'sth sth sth', но' SELECT CONCAT_WS ('', 'sth', 'sth', ' ',' sth ',' ') 'будет возвращать' sth sth sth 'Я не думаю, что есть способ предотвратить дополнительное пространство во втором примере – Kokers

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