MySQL在一列混乱的文本中选择引号“”

时间:2014-10-30 10:12:47

标签: mysql sql triggers substring

我问了一个类似的问题,但它已成为一个更大的问题。

以下问题适用于2个选项,但如果单个选项存储在数据库中则不会。请参阅:使用SUBSTRING_INDEX()。通过Joyal George回答: MYSQL SELECT multiple values between "" in Column

我在WordPress中有一个表单,用于捕获想要在某些区域接收更新的人的信息。他们可以选择1个或更多区域。

然后我有一个报告插件,它只接受SQL来检索报告的数据。没有应用程序层,只有对MYSQL数据库的SQL查询

如果有人只选择1个区域,我只需要提取该区域。如果他们选择的区域超过1个,我需要提取用逗号分隔的每个区域。他们最多可以选择9个区域。

列中的数据如下:

1区:

Western Cape

多个领域:

a:3:{i:0;s:10:"North-West";i:1;s:12:"Western Cape";i:2;s:13:"Northern Cape";}

我正在使用案例陈述(此数据库结构的上一期)

select 
a.entry_id, 
MAX(case when field_id = 74 then entry_value end) as FirstName, 
MAX(case when field_id = 75 then entry_value end) as LastName, 
MAX(case when field_id = 76 then entry_value end) as Email, 
MAX(case when field_id = 78 then entry_value end) as Phone, 
MAX(case when field_id = 79 then
(select concat( 
    SUBSTRING_INDEX( 
        SUBSTRING_INDEX( 
            SUBSTRING_INDEX( 
                entry_value,
                '"',
                4
            ),
            '"',
            2
        ),
        '"',
        -1
    ),
    ",",
    SUBSTRING_INDEX(
        SUBSTRING_INDEX( 
            SUBSTRING_INDEX(
                entry_value,
                '"',
                4
            ),
            '"',
            4
        ),
        '"',
        -1
    )
))
end) as InterestedIn,
MAX(case when field_id = 81 then entry_value end) as Province from ch_arf_entry_values a GROUP BY a.entry_id

我需要调整'as InterestedIn'以仅满足1个输入值。

我需要找到最后一个案例的解决方案'作为省'

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你应该找到一种更好的方式来表达你想要的东西,但我认为以下内容非常接近:

select concat_wc(',', substring_index(substring_index(entry_value, '"', 2), '"' -1),
                 substring_index(substring_index(entry_value, '"', 4), '"' -1),
                 . . .
                )

您可能必须根据字符串中值的数量来设置停止条件,结果如下:

select concat_ws(',',
                 case when num_entry_values >= 1 then substring_index(substring_index(entry_value, '"', 2), '"' -1) end,
                 case when num_entry_values >= 2 then substring_index(substring_index(entry_value, '"', 4), '"' -1) end,
              . . .
             )

如果您没有此号码,可以通过计算字符串中双引号的数量来计算它。

编辑:

要计算条目数,请计算"

from (select aev.*,
             (length(entry_value) = length(replace(entry_value, '"', '')) ) / 2 as num_entry_values
      from ch_arf_entry_values aev
     ) aev