Informix中的子串

时间:2013-12-26 22:23:13

标签: substring informix

我需要根据Informix中的逗号将字段(Name)拆分为Two(名字和姓氏)。

示例:“Mark,Wheeler J”必须分为Mark和Wheeler。我尝试过使用SQL语法,但它在Informix中给出了语法错误。请帮帮我。

SELECT
  SUBSTRING(name, 1, CHARINDEX(',', name ) - 1) AS FirstName,
  SUBSTRING(name, CHARINDEX(',', name) + 1, 8000) AS LastName
FROM
 employee

2 个答案:

答案 0 :(得分:4)

首先,如果您需要拆分这些值,并且如果您需要经常这样做,那么更改数据库架构会更容易:

  1. 将列name重命名为last_name
  2. 添加列first_name
  3. 它有一些优点。您可能希望按姓氏搜索员工,只需拥有此列即可轻松完成。如果姓氏属于name列的一部分,那么您必须使用速度越来越慢的LIKE进行搜索。

    现在您必须更改一些数据。如果您在last_name中有逗号,则在此列中有姓名,您必须将其拆分。

    如果您有charindex()功能,可以使用以下功能:

    UPDATE employees SET last_name=substring(last_name FROM charindex(',', last_name)+1), first_name=substring(last_name FROM 1 FOR charindex(',', last_name)-1) WHERE charindex(',', last_name) > 0;
    

    (您也可以使用TRIM()删除逗号之前/之后的空格(

    从评论我看到你的Informix版本没有CHARINDEX()功能,所以你必须升级数据库引擎或使用干净SQL以外的技术。

    如果您可以使用Java或Python等编程语言(对于此示例,我使用Jython:它是在Java环境中工作的Python并且可以使用JDBC驱动程序),您可以:

    db = DriverManager.getConnection(db_url, usr, passwd)
    # prepare UPDATE:
    pu = db.prepareStatement("UPDATE employee SET last_name=?, first_name=? WHERE id=?")
    
    # search for names that must be changed:
    pstm = prepareStatement("SELECT id, last_name FROM employee WHERE last_name LIKE '%,%')
    
    # for each record found remember its `id`, split `first_name` and update it:
    
    rs = pstm.executeQuery()
    while (rs.next()):
        id = rs.getInt(1)
        name = rs.getString(2)
        first_name, last_name = name.split(',')
        pu.setString(1, last_name.strip())
        pu.setString(2, first_name.strip())
        pu.setInt(3, id)
        rc = pu.executeUpdate()
    

答案 1 :(得分:2)

我遇到了类似的问题所以我为informix 11.50开发了一个以下功能“char_cut”(没有试过不同的版本)请注意,这不是最有效的方法,但它工作正常。

用法:

SELECT
 char_cut(name, ',', 1) AS FirstName,
 char_cut(name, ',', 2) AS LastName
FROM
employee

步骤:

create procedure char_cut( str_in varchar(255), separator_in char(1), field_in int  )
returning varchar(255) ;

define res varchar(255);
define str_len int;
define pos_curr int;
define substr_start int;
define substr_length int;
define pos_char char(1);

IF field_in <= 0 THEN return ''; END IF;

LET res = '';
LET substr_start = 0;
LET substr_length = 0;
LET str_len = length(str_in);

FOR pos_curr = 1 TO str_len

   LET pos_char = substr(str_in,pos_curr,1);
   IF pos_char = separator_in THEN
      LET field_in = field_in - 1;
   END IF;

   IF field_in = 1 and substr_start = 0 THEN
      LET substr_start = pos_curr + DECODE(pos_char,separator_in,1,0);
   END IF;

   IF field_in <= 0 THEN
      LET substr_length = pos_curr;
      EXIT FOR; --KONIEC 
   END IF;

END FOR;

IF substr_length = 0 THEN
   LET substr_length = str_len+1;
END IF;

IF substr_start = 0 THEN
   LET substr_start = str_len+1;
END IF;

IF substr_length < substr_start THEN
   LET substr_length = 0;
ELSE
   LET substr_length = substr_length - substr_start;
END IF;

RETURN NVL(substring ( str_in from substr_start for substr_length ),'');

end procedure;