2016-04-18 2 views
4

Я строю небольшие блоки JSON из функций, и мне нужно фильтровать нулевые значения при цитировании ненулевых значений, подобных этому (MySQL 5.0, в функциях JSON):объединить CONCAT() и COALESCE() для генерации JSON в MySQL

COALESCE(CONCAT('[', 
    group_concat(
     CONCAT('{ "key": "', REPLACE(a.val, '"', '\\"'), '"}') 
     SEPARATOR ', ') 
, ']'), 'null') AS jsonval 

, который выводит что-то подобное (это значение, которое должно быть включено в полном блоке JSON):

  • со значениями: [{"key": "foo"}, {"key": "bar"}, {"key": "baz"}]
  • без значений (NUL L): null
  • с пустой строкой: [{"key": ""}]

Для каждого a.val Я хочу, чтобы добавить запись в моем списке, но есть строка null вместо полного списка, если значение не найдено. Он работает очень хорошо, но мне нужно обрабатывать пустые строки, а также значения NULL как null в результате JSON.

REPLACE(), CONCAT() и COALESCE() работа довольно хорошо вместе нулевых значений, но пустые строки не обнаружены, как я могу справиться с NULL и пустая строка точно так же?

Я видел this question о чередовании нулевых значений, я ищу обратное.

+2

Почему вы генерации JSON из кода SQL? Как правило, вы не должны этого делать (потому что это проблема приложения/передачи данных, а не операция с базой данных). – Dai

+1

Я не должен использовать MySQL 5.0 либо ... Требования к бизнесу! Этот JSON нельзя передавать, но использовать для целей отчетности/обслуживания, мы не можем добавить внешний инструмент для экспорта. – Preuk

+0

, связанный после редактирования: http://stackoverflow.com/questions/12818897/mysql-group-concat-vs-coalesce-concerning-null-values ​​ – Preuk

ответ

6

Просто повторите свою идею!

COALESCE(CONCAT('[', 
    group_concat(
     CONCAT('{ "key": ',COALESCE(CONCAT('"', REPLACE(a.val, '"', '\\"'), '"'), 'null') ,'}') 
     SEPARATOR ', ') 
, ']'), 'null') AS jsonval 

После правки:

COALESCE(CONCAT('[', 
    group_concat(
     CONCAT('{ "key": ', 
      CASE WHEN a.val IS NULL THEN 'null' 
       WHEN a.val = '' THEN 'null' 
       ELSE CONCAT('"', REPLACE(a.val, '"', '\\"'), '"') 
      END 
     ,'}') 
    SEPARATOR ', ') 
, ']'), 'null') AS jsonval 
+0

попробовал это тоже ... проблема REPLACE (NULL, 'foo', 'bar') вернет пустую строку, а не NULL, поэтому COALESCE никогда не будет запускаться. – Preuk

+1

Прекрасно работайте в моих тестах. Может быть конфигурация. выберите COALESCE (CONCAT («foo», REPLACE (NULL, «foo», «bar»), «bar»), «nUlL»); + -------- + | результат | + -------- + | nUlL | + -------- + –

+0

OK my bad, Bogus пустые строки в базе данных. – Preuk