如果MySQL case语句遇到意外值,则创建错误

时间:2019-04-25 22:22:24

标签: mysql

我正在编写一个查询,以分析来自调查回复的某些数据,并将用户输入映射到一个整数列,如果调查受访者未回答问题,则该列可以为null。查询看起来像这样:

SELECT
(CASE
    WHEN some_user_text = 'Yes' THEN 1
    WHEN some_user_text = 'No' THEN 0
    WHEN some_user_text = 'Unknown' THEN NULL
    WHEN some_user_text IS NULL THEN NULL END)
FROM survey_data_table

我希望,如果我不提供ELSE子句,那么MySQL将以某种方式出错,因此我知道需要调整查询以处理更多情况。在这种情况下,MySQL实际上似乎只返回NULL

我已经考虑过使用ELSE 'asdf',以便它尝试将字符串插入tinyint字段中。看来它将“起作用”,但感觉就像是被黑客入侵。这也意味着,对于varchar字段,我需要ELSE 'foo'的字符串长于允许的限制,这感觉像是一个丑陋的黑客。

我已经考虑编写更多代码以确保该列中的值与期望的设置相匹配,但是...要编写和维护的代码也更多。

是否有一种简便而又好的方法?

1 个答案:

答案 0 :(得分:0)

这就是我要做的:

--pseudo code, I don't guarantee this is MySQL syntax for creating a table and inserting 3 rows 
Create table surveydecode(answertext varchar(1000), mapvalue int);
insert into surveydecode values(('yes', 1),('no',0),('unknown',null));

SELECT
  mapvalue,
  CASE WHEN sd.answertext IS NULL THEN sa.some_user_text AS undecodedvalue
FROM
  surveyanswers sa
  LEFT JOIN
  surveydecode sd
  ON
    sa.some_user_text = sd.answertext

现在有了这个

  • 两列均为空表示用户回答了未知
  • mapvalue中为null,undecodedvalue中为字符串“ Maybe”,表示Maybe不是映射值
  • 可以在不更改代码的情况下映射值(insert into surveydecode values ('maybe',2)
  • 您的应用没有崩溃
  • 如果您要崩溃(我真的会避免这种情况),请确保将已映射的值插入到NOT NULL的目标列中,并且具有类似-1的已知值,fit未知(“未知”是“已知未知”,所以为什么没有给它一个值吗?Null可以用于未知的未知数)
  • 此查询的输出可以插入到另一个表中。如果您不希望重复之前的插入内容,请改进查询,以过滤掉“已经处理过的”行,方法是在查询中包括目标表,然后将调查答案表正确加入其中,并有一个where子句要求pk的答案表(联接的左侧)为null,以仅显示调查答案中的行,而不显示destinationtable中的行
  • 如果您想清楚地看到未映射的值,请考虑对列进行排序,以使所有非null undecodedvalue都位于顶部/底部