在MySQL中定位文本位置、提取文本并插入新列

在MySQL中定位文本位置、提取文本并插入新列,mysql,string,return-value,extract,Mysql,String,Return Value,Extract,下面是MySQl表中的行示例 Column A Row1 Lauguage=English&Country=USA&Gender=Male Row2 Gender=Female&Language=French&Country= Row3 Country=Canada&Gender=&Language=English 如何实现以下目标:例如,我需要寻找国家 我需要在这个文本栏中找到国家的位置。

下面是MySQl表中的行示例

              Column A    

Row1    Lauguage=English&Country=USA&Gender=Male
Row2    Gender=Female&Language=French&Country=
Row3    Country=Canada&Gender=&Language=English
如何实现以下目标:例如,我需要寻找国家

  • 我需要在这个文本栏中找到国家的位置。这会随着行的变化而变化
  • 然后我需要忽略参数'Country=',只提取值。在某些情况下,这将是NULL(如第2行中的示例),而在某些行中,我需要后跟“=”的值(如第1行和第3行中的示例)。但是,我需要确保我只得到值。不是由“&”分隔的下一个参数
  • 提取完Country参数的值后,我需要创建一个新列,在其中提取和存储这些值
  • 最终结果:新列

                  Column B                                                
    
    Row1            USA                            
    Row2                              
    Row3           Canada                                  
    

    任何帮助都将不胜感激!谢谢

    您可以选择“Country=”后面的文本,然后在获得该子字符串后,选择第一个“&”之前的文本

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ColumnA, 'Country=', -1), '&', 1) AS ColumnB
    FROM `atable`
    


    下面是一个测试来演示:

    mysql> SELECT * FROM atable;
    +------+------------------------------------------+
    | row  | columna                                  |
    +------+------------------------------------------+
    | Row1 | Lauguage=English&Country=USA&Gender=Male |
    | Row2 | Gender=Female&Language=French&Country=   |
    | Row3 | Country=Canada&Gender=&Language=English  |
    +------+------------------------------------------+
    
    mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ColumnA, 'Country=', -1), '&', 1) AS ColumnB FROM atable;
    +---------+
    | ColumnB |
    +---------+
    | USA     |
    |         |
    | Canada  |
    +---------+
    

    下面是你的问题:

    INSERT INTO atable VALUES ('Row4', 'Gender=&Language=English');
    
    SELECT `row`, IF(LOCATE('Country=', ColumnA)>0, 
      COALESCE(
        NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(ColumnA, 'Country=', -1), '&', 1), ''), 
        'Blank string is not valid!'), 
     'Missing Country!') AS ColumnB     
    FROM `atable`
    
    +------+----------------------------+
    | row  | ColumnB                    |
    +------+----------------------------+
    | Row1 | USA                        |
    | Row2 | Blank string is not valid! |
    | Row3 | Canada                     |
    | Row4 | Missing Country!           |
    +------+----------------------------+
    

    然而,在SQL中,我有一个完全相同的问题,对于任何想要SQL答案的人,请参见Tim Biegeleisen评论


    为什么要把这样的数据放在表中?规范化使用
    LOCATE()
    SUBSTRING()
    函数。不幸的是,这在SQL中很复杂,因为您需要使用对
    LOCATE()
    的嵌套调用来查找结束它的
    &
    。谢谢,但这似乎只适用于第3行中的示例。参数Country=的位置不一致。它可以是第一个参数,也可以是第五个参数。有没有办法找到Country=然后查找下一个“&”并获得要显示的值?在excel中试用:1。列数据存储在A1 2中。查找存储在B1列3中的(“Country=,A1)->(国家位置)。IFERROR(FIND(“=”A1,B1),LEN(A1)->(位置=)存储在列C1 4中。IFERROR(FIND(“&”,A1,C1),LEN(A1)+1)->(结束位置)存储在列D1 5中。MID(A1,C1+1,D1-C1-1)->在单元格中显示国家/地区值E1@Nowitz41,我测试了它并包含了上面的输出。感谢您的输出。现在可以工作了!对于参数Country=为空(例如:Country=&)的行,快速跟进如果Country=不存在,是否有办法添加此错误检查功能?因此,这只会更新Country=具有“有效”值的行。感谢您的帮助!感谢您的帮助!@nowiz41,太好了,我很乐意提供帮助。顺便说一句,在StackOverflow上,习惯上用向上投票或“接受答案”标记有用的答案.
    create table elb_logs(row varchar(100), url varchar(100));
    insert into elb_logs values("Row1", "Lauguage=English&Country=USA&Gender=Male");
    
    SELECT
        row,
        CASE WHEN POSITION('Country=' IN url) > 0
             THEN SPLIT_PART(SPLIT_PART(url, 'Country=', 2), '&', 1)
             ELSE 'Missing Country!' END AS ColumnB
    FROM elb_logs;