目前正在使用Firebird 1.5数据库并尝试使用SQL本地提取正确格式的数据。
考虑以下数据库:
ID | Full Name
1 Jon Doe
2 Sarah Lee
我想要实现的是对查询中的全名字段(空格)进行简单拆分。
ID | First Name | Last Name
1 Jon Doe
2 Sarah Lee
面临的问题是Firebird POSITION()是在v2.0中引入的。是否有任何已知的解决方法可以拆分任何人遇到过的空间?
非常感谢您的协助!
答案 0 :(得分:3)
对于Firebird 1.5,解决方案是找到一个UDF,它既可以组合两个函数,也可以提供位置(我不使用UDF,因此我不确定是否已存在)。如果没有,你可能需要写一个。
另一种解决方案是为此功能编写存储过程,例如参见:Position of substring function in SP
CREATE PROCEDURE Pos (SubStr VARCHAR(100), Str VARCHAR(100))
RETURNS (Pos INTEGER) AS
DECLARE VARIABLE SubStr2 VARCHAR(201); /* 1 + SubStr-lenght + Str-length */
DECLARE VARIABLE Tmp VARCHAR(100);
BEGIN
IF (SubStr IS NULL OR Str IS NULL)
THEN BEGIN Pos = NULL; EXIT; END
SubStr2 = SubStr || '%';
Tmp = '';
Pos = 1;
WHILE (Str NOT LIKE SubStr2 AND Str NOT LIKE Tmp) DO BEGIN
SubStr2 = '_' || SubStr2;
Tmp = Tmp || '_';
Pos = Pos + 1;
END
IF (Str LIKE Tmp) THEN Pos = 0;
END
此示例(取自链接)可以扩展为使用SUBSTRING
分割空间。
对于像空格这样的单个字符的搜索,可能设计出比上述存储过程更简单的解决方案。为满足您的确切需求,您可能需要专门为此目的编写可选择的存储过程。
但是,将数据库升级到Firebird 2.5会为您提供更多powerful internal functions来简化此查询(以及您的生活)!
答案 1 :(得分:0)
您可以使用UDF,但这不是严格的SQL
你可以写一个存储过程来解析和拆分,但那不是严格的SQL
答案 2 :(得分:0)
我还想将全名字符串拆分为名字和姓氏,我在firebird 2.1数据库中使用了以下SQL语句:
患者是表名。 名称字段包含全名字符串,例如:“Jon Doe”。 FIRST_NAME 字段将存储名字, LAST_NAME 字段将存储姓氏
首先获取第一个名称(第一个空格之前的字符串部分)并执行TRIM UPDATE语句以删除任何空格。
UPDATE "Patients" SET "Patients".FIRST_NAME = (SUBSTRING("Patients"."Name" FROM 1 FOR (POSITION(' ' IN "Patients"."Name"))))
UPDATE "Patients" SET "Patients".FIRST_NAME = TRIM(BOTH ' ' FROM "Patients".FIRST_NAME)
然后获取姓氏(第一个空格后的字符串)并执行TRIM UPDATE语句以删除任何空格
UPDATE "Patients" SET "Patients"."LAST_NAME" = (SUBSTRING("Patients"."Name" FROM (POSITION(' ' IN "Patients"."Name")+1)))
UPDATE "Patients" SET "Patients".LAST_NAME = TRIM(BOTH ' ' FROM "Patients".LAST_NAME)
结果将是:
ID | NAME | FIRST_NAME | LAST_NAME
1 Jon Doe Jon Doe
2 Sarah Lee Sarah Lee