我的数据库中有一个表,user_answers
它存储用户对一系列问题的回答,并带有行;user_id
, question_id
,answer_id
和text_entry
. 问题文本和答案文本(如果有)存储在查找表中。题型分为单选题、多选题和文字输入题三种。因此,单个用户可能在user_answers
表中具有如下条目:
user_id question_id answer_id text_entry
------- ----------- --------- ----------
123 100 1010 (null)
123 200 2010 (null)
123 200 2030 (null)
123 300 3000 "code 789"
可以说这张questions_text
桌子有:
question_id text
----------- -------------
100 "Gender"
200 "Interests"
300 "Your code"
并且answers_text
表格有:
answer_id text
--------- -----------
1010 "Female"
1020 "Male"
2010 "Sports"
2020 "Computers"
2030 "Movies"
3000 (null)
我想将数据提取到 csv 中,每个 user_id 一行显示答案,如下所示:
User,Gender,Sports,Computers,Movies,Code
123,Female,1,0,1,code 789
我知道如何通过 SQLPlus 生成 CSV 文件(由于我无法控制的原因,我只能通过 SQLPlus 访问数据库......)但我不知道如何生成 PL/SQL 语句。
在 PL/SQL 中,我知道我可以通过做
SELECT
user_id || ',' ||
MIN(DECODE(question_id, '100', (SELECT text FROM answers_text where answer_id = answer_text.answer_id)))
FROM user_answers
GROUP BY user_id
ORDER BY user_id
;
(我不是 SQL 人,所以这是从互联网上复制的!)
此代码(至少就我的测试告诉我而言)适用于单答案问题,但不适用于多答案或文本输入类型的问题。
我在网上看到了一些关于case
在 PL/SQL 中使用语句的内容,如下所示:
MIN(CASE WHEN question_id = '200' AND answer_id = '2010' THEN '1' ELSE '0' END)
...但我不知道如何将答案放入列中。我能找到的所有可能相关的 SO 问题都是特定于 sql-server 的。
有没有办法从单个 PL/SQL 语句生成我想要的输出?最好以不依赖于表中数据的方式编写,因为我们有许多可能需要在其上运行的数据库。