我有2个csv文件。在一个文件中,我有一个价格的电话号码,在第二个文件中,我有一个电话号码,其中包含所有者的姓名。
第一个文件:file1.csv
491732234332; 30,99
491723427343; 12,59
491732097232; 33,31
第二个文件:file2.csv
01732/234332; Ben Jefferson
01723/427343; Jon Doe
01732/097232;本杰明富兰克林
我的问题是,电话号码列的格式不同,我找不到比较它们的方法。
所需的输出是:
01732/234332; 30,99; Ben Jefferson
01723/427343; 12,59; Jon Doe
01732/097232; 33,31;本杰明富兰克林
我的sql语句是
create temp table FILETB1
(phonenr char(30),
price char(30)
);
create temp table FILETB2
(phonenr char(40),
owner char(60)
);
load from "file1.csv"
insert into FILETB1;
load from "file2.csv"
insert into FILETB2;
unload to "output.csv"
select FILETB1.phonenr, FILETB1.price, FILETB2.owner
from FILETB1, FILETB2
where FILETB1.phonenr = FILETB2.phonenr
如何修改where子句以便能够比较两列?
我们正在使用 IBM INFORMIX-SQL Version 7.50.UC5 开发linux,这使得找到一个可行的解决方案变得不容易,因为不支持许多功能......
非常感谢任何帮助!
答案 0 :(得分:1)
只使用ISQL的功能,您可以使用:
CREATE TEMP TABLE FILETB1
(
phonenr CHAR(30),
price CHAR(30)
);
CREATE TEMP TABLE FILETB2
(
phonenr CHAR(40),
owner CHAR(60)
);
LOAD FROM "file1.csv" DELIMITER ';' INSERT INTO FILETB1;
LOAD FROM "file2.csv" DELIMITER ';' INSERT INTO FILETB2;
UNLOAD TO "output.csv" DELIMITER ';'
SELECT FILETB2.phonenr, FILETB1.price, FILETB2.owner
FROM FILETB1, FILETB2
WHERE FILETB1.phonenr[3,6] = FILETB2.phonenr[2,5]
AND FILETB1.phonenr[7,12] = FILETB2.phonenr[7,12];
使用DB-Access进行测试,我得到了:
$ dbaccess stores so-35360310.sql
Database selected.
Temporary table created.
Temporary table created.
3 row(s) loaded.
3 row(s) loaded.
3 row(s) unloaded.
Database closed.
$ cat output.csv
01732/234332;30,99;Ben Jefferson;
01723/427343;12,59;Jon Doe;
01732/097232;33,31;Benjamin Franklin;
$
关键是使用内置子串[start,end]
运算符。您可以比较可比较的电话号码的两个部分。然后从file2.csv
(表格FILETB2
)中选择一个数字,因为这是您想要的格式。
对于示例数据,当然,您可以简单地使用Unix命令行工具来完成这项工作,但是知道如何在DBMS中执行此操作也是有帮助的。
您也可以使用SUBSTR(col, start, len)
功能:
UNLOAD TO "output2.csv" DELIMITER ';'
SELECT FILETB2.phonenr, FILETB1.price, FILETB2.owner
FROM FILETB1, FILETB2
WHERE SUBSTR(FILETB1.phonenr, 3, 3) = SUBSTR(FILETB2.phonenr, 2, 3)
AND SUBSTR(FILETB1.phonenr, 7, 6) = SUBSTR(FILETB2.phonenr, 7, 6);
这会从样本数据中生成相同的输出。
如果ISQL无法识别DELIMITER ';'
(或UNLOAD
)伪SQL语句的LOAD
子句,则可以在运行之前设置环境变量DBDELIMITER=';'
脚本并从SQL中删除这些子句。
答案 1 :(得分:0)
对于 file2.csv ,如果您使用tr
,则提示:
[infx1210@tardis ~]$ cat file2.csv | tr '/' ';' > file.2
[infx1210@tardis ~]$ cat file.2
01732;234332;Ben Jefferson
01723;427343;Jon Doe
01732;097232;Benjamin Franklin
[infx1210@tardis ~]$
对于 file1.csv ,如果你知道前缀总是6位数,你可以使用:
[infx1210@tardis ~]$ cut -c7- file1.csv > file.1
[infx1210@tardis ~]$ cat file.1
234332;30,99
427343;12,59
097232;33,31
[infx1210@tardis ~]$
如您所见,您可以使用 file.1 的第一个字段直接与 file.2 上的第二个字段交叉。
然后你可以执行:
CREATE TEMP TABLE filetb1(
phonenr CHAR(30),
price CHAR(30)
);
CREATE TEMP TABLE filetb2(
prefix CHAR(30),
phonenr CHAR(30),
owner CHAR(60)
);
LOAD FROM 'file.1' DELIMITER ';' INSERT INTO filetb1;
LOAD FROM 'file.2' DELIMITER ';' INSERT INTO filetb2;
UNLOAD TO 'output.csv' DELIMITER ';'
SELECT
TRIM(f2.prefix )|| '/' || TRIM(f2.phonenr),
f1.price,
f2.owner
FROM
filetb1 f1, filetb2 f2
WHERE
f1.phonenr = f2.phonenr;
你会得到患病的输出:
[infx1210@tardis ~]$ cat output.csv
01732/234332;30,99;Ben Jefferson;
01723/427343;12,59;Jon Doe;
01732/097232;33,31;Benjamin Franklin;
[infx1210@tardis ~]$
如果您不确定 file1.csv 上的前缀是否为6位数,请将其保留并使用LIKE
:
CREATE TEMP TABLE filetb1(
phonenr CHAR(30),
price CHAR(30)
);
CREATE TEMP TABLE filetb2(
prefix CHAR(30),
phonenr CHAR(30),
owner CHAR(60)
);
LOAD FROM 'file.1' DELIMITER ';' INSERT INTO filetb1;
LOAD FROM 'file.2' DELIMITER ';' INSERT INTO filetb2;
UNLOAD TO 'output.csv' DELIMITER ';'
SELECT
TRIM(f2.prefix )|| '/' || TRIM(f2.phonenr),
f1.price,
f2.owner
FROM
filetb1 f1, filetb2 f2
WHERE
f1.phonenr LIKE TRIM(f2.phonenr)||'%';