【问题标题】:Mysql function that query a table and reconstruct a string from the query-result查询表并从查询结果重建字符串的 Mysql 函数
【发布时间】:2015-05-08 17:23:54
【问题描述】:

我是 mysql 编程的新手,我会创建一个带有字符串参数的 mysql 函数 myFunction;查询一个表并从查询结果中重建一个字符串,如下例所示:

myTable
 ---------------
|id   |  value   |
 ---------------
| id1 |value1    |
| id2 |value2    |
| id3 |value3    |
| id4 |value4    |
 ---------------

调用这个函数是这样的

myFunction('value2#value1#value4')

并且必须返回

 'id2#id1#id4'

【问题讨论】:

    标签: mysql sql function


    【解决方案1】:

    查看SQL Fiddle

    我的桌子

    -- the table def
    create table myTable (id char(3), value char(6));
    insert into myTable values( 'id1', 'value1');
    insert into myTable values( 'id2', 'value2');
    insert into myTable values( 'id3', 'value3');
    insert into myTable values( 'id4', 'value4');
    

    获取特定 ID

    -- get Id by Value
    CREATE function getIdByValue( theValue TEXT ) 
    RETURNS TEXT READS SQL DATA
    BEGIN
      DECLARE theId TEXT;
      DECLARE ok INT DEFAULT FALSE;
      DECLARE crs CURSOR FOR 
        SELECT id FROM myTable where value = theValue;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET ok = TRUE;
    
      SET theId = '';
    
      OPEN crs;
      read_loop: LOOP
        FETCH crs INTO theId;
        IF ok THEN
          LEAVE read_loop;
        END IF;
      END LOOP;
      CLOSE crs;
      RETURN theId;
    END//
    

    您描述的 MyFunction

    -- the myFunction, usage: myFunction('value2#value1#value4')
    CREATE function myFunction( v TEXT )
    RETURNS TEXT READS SQL DATA
    BEGIN
      DECLARE theId TEXT;
      DECLARE theIds TEXT;
      DECLARE theValue TEXT;
      DECLARE vInstr INT;
    
      SET theId  = '';
      SET theIds = '';
    
      v_loop: LOOP
    
        SET vInstr = INSTR(v,'#');
        IF vInstr = 0 THEN
          SET theValue = v;
          SET theId = getIdByValue(theValue);
        ELSE
          SET theValue = SUBSTRING(v, 1, vInstr-1);
          SET v = SUBSTRING(v, vInstr+1);
          SET theId = concat( getIdByValue(theValue), '#');
        END IF;
    
        SET theIds = CONCAT(theIds, theId);
    
        IF vInstr = 0 THEN
          LEAVE v_loop;
        END IF;
    
      END LOOP; 
    
      RETURN theIds;
    END//
    

    来电

    SELECT myFunction( 'value2' );
    SELECT myFunction( 'value2#value4' );
    SELECT myFunction( 'value2#value4#value1' );
    SELECT myFunction( 'value2#value4#value1#value3' );
    

    结果

    id2
    id2#id4
    id2#id4#id1
    id2#id4#id1#id3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多