【问题标题】:Mysql field with separated values具有分隔值的 Mysql 字段
【发布时间】:2020-08-27 09:28:38
【问题描述】:

我正在尝试编写报告以从表单中提取条目。表格如下所示: Form Sample

我找到了包含这些数据的表格,表格上问题所在的行如下所示

id,evaluation,template,name,label,presentation,typ,hasvalue,position,required,dependitem,dependvalue,options,grade,correctanswer
286,20,0,"Perform equipment test",,"r>>>>>5
|4
|3
|2
|1
|NA",radiobuttonselection,1,24,1,0,,h,0,

我想提请您注意的“演示文稿”字段。该字段的值为:

"r>>>>>5
|4
|3
|2
|1
|NA"

这只是存储在行中的列中的一个值。

我还找到了存储表单响应的表。它有一个名为“value”的整数列,在这种情况下,它将包含一个从 1 到 6 的值。1 表示“presentation”列中的第一项,a 5。A 6 表示 N/A。

如何编写我的选择以将表单响应的 1-6 值转换为“演示文稿”字段中的描述性值?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    MySQL 没有内置函数来拆分字符串,但您可以像这样创建一个:

    DROP FUNCTION IF EXISTS SPLIT_STRING;
    CREATE FUNCTION SPLIT_STRING(delim VARCHAR(3), str VARCHAR(255), pos INT)
    RETURNS VARCHAR(255) DETERMINISTIC
    RETURN
        REPLACE(
            SUBSTRING(
                SUBSTRING_INDEX(str, delim, pos),
                LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1
            ),
            delim, ''
        );
    

    如果我正确理解了您的问题,您希望从查询中的查找表中获得答案。我认为它们在个别专栏中是最好的。在下面的代码中,我只是转置了两个答案,但您可以以类似的方式处理所有答案。

    with mod_form_data as
    (SELECT *, right(SPLIT_STRING('|', presentation, 1),1) first,
      SPLIT_STRING('|', presentation, 2) second
    from form_data)
    select id, (select answer from answers where id = mfd.first),
    (select answer from answers where id = mfd.second) 
    from mod_form_data mfd
    

    我用您重新创建的数据进行了测试,如下所示。

    CREATE TABLE form_data (
      `id` INTEGER,
      `evaluation` INTEGER,
      `template` INTEGER,
      `name` VARCHAR(24),
      `label` varchar(2),
      `presentation` VARCHAR(20),
      `typ` VARCHAR(20),
      `hasvalue` INTEGER,
      `position` INTEGER,
      `required` INTEGER,
      `dependitem` INTEGER,
      `dependvalue` varchar(100),
      `options` VARCHAR(1),
      `grade` INTEGER,
      `correctanswer` varchar(100)
    );
    
    INSERT INTO form_data
      (`id`, `evaluation`, `template`, `name`, `label`, `presentation`, `typ`, `hasvalue`, `position`, `required`, `dependitem`, `dependvalue`, `options`, `grade`, `correctanswer`)
    VALUES
      ('286', '20', '0', 'Perform equipment test', '', 'r>>>>>5|4|3|2|1|NA', 'radiobuttonselection', '1', '24', '1', '0', '', 'h', '0', '');
           
    
              
    create table answers (id integer, answer varchar(255));                                                   
    insert into answers values (5, 'One answer');
    insert into answers values (4, 'Another answer');  
    
     
    

    【讨论】:

    • 我认为这有效,除了 pos = 1,它返回 'r>>>>>5' 而不是 5,但我想我知道如何修改它以适用于 pos = 1。谢谢!
    • 如果它适合您,请点赞并接受答案。如我的帖子中所述,我没有遍历拆分字符串的每个部分。第一个展示了如何使用子字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多