我需要根据 Informix 中的逗号将一个字段(名称)分成两个(名字和姓氏)。
示例:“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
首先,如果您需要拆分这些值并且需要经常这样做,那么更改数据库模式会更容易:
name
重命名为 last_name
first_name
它有一些优点。您可能想按姓氏搜索员工,当您只有这样的列时,这很容易。如果姓氏是
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 环境中工作并且可以使用 JDBC 驱动程序的 Python),您可以:
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()
我遇到了类似的问题,所以我为 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;
SELECT
SUBSTRING_INDEX(name, ",", 1) as FirstName,
SUBSTRING_INDEX(name, ",", -1) as LasstName
FROM
employee
https://www.ibm.com/docs/en/informix-servers/12.10?topic=functions-substring-index-function