如何编写SQL实现按MaxNoAnswers生成问卷问题标签?
问题:根据问题的最大可选数量生成对应数量的问题标签
我正在制作一份展示调查结果的报告,对于带有选项的问题,需要为每个选项生成一行数据以创建问题标签,但部分问题限制了用户可选择的选项数量。
数据库架构
Question表
----------------------------------------------------------- | ID | Question | Sequence | MaxNoAnswers | ----------------------------------------------------------- | 1 | Question 1 | 1 | 2 | | 2 | Question 2 | 2 | NULL | -----------------------------------------------------------
Options表
------------------------------------------------------- |OptionID | Name | QuestionID | Sequence | ------------------------------------------------------- | 1 | Option 1 | 1 | 1 | | 2 | Option 2 | 1 | 2 | | 3 | Option 3 | 1 | 3 | | 4 | Option 4 | 1 | 4 | | 5 | Option 5 | 2 | 1 | | 6 | Option 6 | 2 | 2 | | 7 | Option 7 | 2 | 3 | | 8 | Option 8 | 2 | 4 | -------------------------------------------------------
我原本使用的SQL语句如下:
SELECT 'Q' + CONVERT(NVARCHAR(10), q.[ID]) + '_' + CONVERT(NVARCHAR(10), o.Sequence) AS QuestionLabel, q.Question FROM Question q INNER JOIN Options o ON o.QuestionID = q.ID
执行后得到的结果:
----------------------------------- | QuestionLabel | Question | ----------------------------------- | Q1_1 | Question 1 | | Q1_2 | Question 1 | | Q1_3 | Question 1 | | Q1_4 | Question 1 | | Q2_1 | Question 2 | | Q2_2 | Question 2 | | Q2_3 | Question 2 | | Q2_4 | Question 2 | -----------------------------------
但我需要实现:当问题设置了MaxNoAnswers时,仅生成从1到该数值的标签;如果MaxNoAnswers为NULL,则保留所有选项对应的标签。预期结果如下:
----------------------------------- | QuestionLabel | Question | ----------------------------------- | Q1_1 | Question 1 | | Q1_2 | Question 1 | | Q2_1 | Question 2 | | Q2_2 | Question 2 | | Q2_3 | Question 2 | | Q2_4 | Question 2 | -----------------------------------
请问如何编写SQL实现该需求?
解决方案
你可以通过添加条件过滤来实现需求,以下是两种可行的实现方式:
方式一:在WHERE子句中添加过滤逻辑
SELECT 'Q' + CONVERT(NVARCHAR(10), q.[ID]) + '_' + CONVERT(NVARCHAR(10), o.Sequence) AS QuestionLabel, q.Question FROM Question q INNER JOIN Options o ON o.QuestionID = q.ID WHERE (q.MaxNoAnswers IS NOT NULL AND o.Sequence <= q.MaxNoAnswers) OR q.MaxNoAnswers IS NULL
方式二:在JOIN条件中整合过滤逻辑
SELECT 'Q' + CONVERT(NVARCHAR(10), q.[ID]) + '_' + CONVERT(NVARCHAR(10), o.Sequence) AS QuestionLabel, q.Question FROM Question q INNER JOIN Options o ON o.QuestionID = q.ID AND (q.MaxNoAnswers IS NULL OR o.Sequence <= q.MaxNoAnswers)
逻辑说明
- 对于
MaxNoAnswers不为NULL的问题,仅保留选项Sequence值小于等于该限制数值的记录; - 对于
MaxNoAnswers为NULL的问题,保留所有关联的选项记录。
两种方式都能得到预期结果,推荐使用方式二,因为将过滤条件放在JOIN中可以提前筛选不符合条件的记录,性能表现更优。
内容的提问来源于stack exchange,提问作者antonio_mg
相关产品推荐
相关产品推荐

