简体   繁体   中英

Nested Case Statement Logic

I am working on a query to flatten some wp_postsmeta data in a WordPress database and need to set a specific value on various meta_values. I have a key of category and various category values, for each value, I want to set a column named color with a named color for our brand palette

    select post_title as title, 
 MAX(CASE WHEN meta_key='corporate_calendar_category' THEN meta_value END) as 'category',
 MAX(CASE WHEN meta_key = 'corporate_calendar_subcategory' THEN meta_value END) as 'subcategory',

 // Do I need to include a nested CASE WHEN?
 MAX(CASE WHEN meta_key = 'corporate_calendar_subcategory' and meta_value = 'Marketing' THEN 'blueLagoon' END) as 'color',

 MAX(CASE WHEN meta_key = 'corporate_calendar_presenter' THEN meta_value END) as 'presenter',
 MAX(CASE WHEN meta_key = 'corporate_calendar_date' THEN meta_value END) as 'start_date',
 MAX(CASE WHEN meta_key = 'corporate_calendar_time' THEN meta_value END) as 'start_time',
 MAX(CASE WHEN meta_key = 'corporate_calendar_duration' THEN meta_value END) as 'duration',
 MAX(CASE WHEN meta_key = 'corporate_calendar_registration_link' THEN meta_value END) as 'registration_link',
 MAX(CASE WHEN meta_key = 'corporate_calendar_description' THEN meta_value END) as 'description',
 MAX(CASE WHEN meta_key = 'corporate_calendar_image_path' THEN meta_value END) as 'image_path'

FROM   wp_posts p 
JOIN wp_postmeta m ON p.id = m.post_id
where p.post_type = 'calendar-event'
and p.post_status = 'publish'
GROUP BY p.id

corporate_calendar_subcategory has many values, Marketing, HR, Company Holiday, etc, and for each subcategory I want each row to have a specific color.

title     category   subcategory       color        presenter   start_date etc.
Example   Training   Marketing         blueLagoon   someone     08/29/2018
Labor Day Reminder   Company Holiday   camelot                  09/03/2018
etc
etc

Is the best way to achieve this to use a nested CASE WHEN against the meta_value? Or is there a better way?

I also tried including an if statement (below) but that duplicated each row.

if(meta_key = 'corporate_calendar_subcategory', 
 CASE
   WHEN meta_value = 'Marketing' THEn 'blueLagoon'
   WHEN meta_value = 'Company Holiday' THEN 'camelot'
 END,
 '') as color,

Yes, the nested CASE statement would be the right way to go if you know all the categories and colors beforehand. If the category-colors are in another table, you can do either a subselect or a JOIN instead.

Here's an example with nested case:

max(case when meta_key = 'corporate_calendar_subcategory' then
    case meta_value
        when 'Marketing' then 'blue'
        when 'Sales' then 'yellow
        when 'Development' then 'red'
    end
end)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM