'Having an issue writing a functional sequelize query for case-when
I am trying to put this query for case when, but it's not working:
[db.Sequelize.literal('case when "survey_session_question->scq"."eng_question_text" is not null then "survey_session_question->scq"."eng_question_text" else "survey_session_question->scq->base_question"."eng_question_text" end'), 'eng_question_text']
I should be getting the values where the field eng_question_text is not null, but am still getting values where eng_question_test is null.
Could someone please point out why it's not working the way it should here?
EDIT: I edited the query but it's still not functioning properly, as in some null questions and null ids are coming in final output when it shouldn't.
Original query tht worked:
select case when scq.eng_question_text is not null then scq.eng_question_text
else bcq.eng_question_text end as eng_question_text,
ssa.answer_text as answer_comments, scq.id as survey_question_id
from survey_sessions ss
join survey_session_questions ssq on ssq.survey_session_id = ss.id
join survey_session_answers ssa on ssa.session_question_id = ssq.id
join survey_links sl on sl.id = ss.survey_link_id
join survey_custom_questions scq on scq.id = ssq.survey_question_id
left join base_custom_questions bcq on bcq.id = scq.base_custom_question_id
where ss.status_code = 'COMPLETE' and scq.survey_id = :surveyId
and ssa.answer_text is not null and ssa.answer_text != ''
My sequelize veersion-----
.findAll({
attributes: [
[db.Sequelize.literal('"session_question->survey_session->survey_link->survey->client"."client_full_name"'), 'client_full_name'],
[db.Sequelize.literal('case when "session_question->scq"."eng_question_text" is not null then "session_question->scq"."eng_question_text" else "session_question->scq->base_question"."eng_question_text" end'), 'eng_question_text'],
['answer_text','answer_comments'],
[db.Sequelize.literal('"session_question->scq"."id"'), 'survey_question_id']
],
where:{
[Op.and]: [
{
answer_text: { [Op.ne]: null }
}
, {
answer_text: { [Op.ne]: '' }
}
]
}
,include: [
{
model: db.SurveySessionQuestion
, as: 'session_question'
, attributes: []
, include:
[
{
model: db.SurveySession
, as: 'survey_session'
, attributes: []
, where:{status_code:'COMPLETE'}
, include:[
{
model: db.SurveyLink
, as: 'survey_link'
, attributes: []
, include:
[
{
model: db.Survey
, as: 'survey'
, attributes: []
, include:
[
{
model: db.Client
, as: 'client'
, attributes: []
}
]
}
]
}
]
},
{
model: db.SurveyCustomQuestion
, as: 'scq'
, attributes: []
, where: {
survey_id: surveyId
}
, include:[
{
model:db.BaseCustomQuestion
,as:'base_question'
,attributes: []
}
]
}
]
}
]
});
Generated sql query-----
select
"SurveySessionAnswer"."id",
"session_question->survey_session->survey_link->survey->client"."client_full_name" as "client_full_name",
case
when "session_question->scq"."eng_question_text" is not null then "session_question->scq"."eng_question_text"
else "session_question->scq->base_question"."eng_question_text"
end as "eng_question_text",
"SurveySessionAnswer"."answer_text" as "answer_comments",
"session_question->scq"."id" as "survey_question_id"
from
"survey_session_answers" as "SurveySessionAnswer"
left outer join ( "survey_session_questions" as "session_question"
inner join "survey_sessions" as "session_question->survey_session" on
"session_question"."survey_session_id" = "session_question->survey_session"."id"
and ("session_question->survey_session"."deletedAt" is null
and "session_question->survey_session"."status_code" = 'COMPLETE')
left outer join "survey_links" as "session_question->survey_session->survey_link" on
"session_question->survey_session"."survey_link_id" = "session_question->survey_session->survey_link"."id"
and ("session_question->survey_session->survey_link"."deletedAt" is null)
left outer join "surveys" as "session_question->survey_session->survey_link->survey" on
"session_question->survey_session->survey_link"."survey_id" = "session_question->survey_session->survey_link->survey"."id"
and ("session_question->survey_session->survey_link->survey"."deletedAt" is null)
left outer join "clients" as "session_question->survey_session->survey_link->survey->client" on
"session_question->survey_session->survey_link->survey"."client_id" = "session_question->survey_session->survey_link->survey->client"."id"
and ("session_question->survey_session->survey_link->survey->client"."deletedAt" is null)
inner join "survey_custom_questions" as "session_question->scq" on
"session_question"."survey_question_id" = "session_question->scq"."id"
and ("session_question->scq"."deletedAt" is null
and "session_question->scq"."survey_id" = '57d88936-eb2d-11eb-ae65-13e560ff06c2')
left outer join "base_custom_questions" as "session_question->scq->base_question" on
"session_question->scq"."base_custom_question_id" = "session_question->scq->base_question"."id" ) on
"SurveySessionAnswer"."session_question_id" = "session_question"."id"
and ("session_question"."deletedAt" is null)
where
("SurveySessionAnswer"."deletedAt" is null
and ("SurveySessionAnswer"."answer_text" is not null
and "SurveySessionAnswer"."answer_text" != ''));```
Solution 1:[1]
so I found how to remove the null data from my results. I added the following line in model: db.SurveySessionQuestion: where:{survey_question_id:{[Op.ne]:null}}
This takes out the null values from the output, and the case when seems to be functioning as required after this.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Shom |
