isql“select ... 其中 'a part of a column value' = 'a part of a column value'
isql "select ... where 'a part of a column value' = 'a part of a column value'
我有 2 个 csv 文件。在一个文件中,我有一个带有价格的 phone 数字,在第二个文件中,我有一个带有所有者姓名的 phone 数字。
第一个文件:file1.csv
491732234332;30,99
491723427343;12,59
491732097232;33,31
第二个文件:file2.csv
01732/234332;Ben Jefferson
01723/427343;Jon Doe
01732/097232;Benjamin Franklin
我的问题是,phone 数字列的格式不同,我找不到比较它们的方法。
期望的输出是:
01732/234332;30,99;Ben Jefferson
01723/427343;12,59;Jon Doe
01732/097232;33,31;Benjamin Franklin
我的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 子句才能比较两列?
我们正在 linux 使用 IBM INFORMIX-SQL 7.50.UC5 版本,这使得找到一个可行的解决方案并不容易,因为许多功能都不是支持...
非常感谢任何帮助!
建议是,对于 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[=34 中的第二个字段交叉=].
然后可以执行:
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)||'%';
仅使用 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]
运算符。您比较可比较的 phone 数字的两个部分。你 select 来自 file2.csv
(table 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);
这会从样本数据中产生相同的输出。
如果我SQL不识别UNLOAD
(或LOAD
)伪SQL语句的DELIMITER ';'
子句,那么你可以设置运行 脚本之前的环境变量 DBDELIMITER=';'
并从 SQL.
中删除这些子句
我有 2 个 csv 文件。在一个文件中,我有一个带有价格的 phone 数字,在第二个文件中,我有一个带有所有者姓名的 phone 数字。
第一个文件:file1.csv
491732234332;30,99
491723427343;12,59
491732097232;33,31
第二个文件:file2.csv
01732/234332;Ben Jefferson
01723/427343;Jon Doe
01732/097232;Benjamin Franklin
我的问题是,phone 数字列的格式不同,我找不到比较它们的方法。
期望的输出是:
01732/234332;30,99;Ben Jefferson
01723/427343;12,59;Jon Doe
01732/097232;33,31;Benjamin Franklin
我的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 子句才能比较两列?
我们正在 linux 使用 IBM INFORMIX-SQL 7.50.UC5 版本,这使得找到一个可行的解决方案并不容易,因为许多功能都不是支持...
非常感谢任何帮助!
建议是,对于 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[=34 中的第二个字段交叉=].
然后可以执行:
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)||'%';
仅使用 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]
运算符。您比较可比较的 phone 数字的两个部分。你 select 来自 file2.csv
(table 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);
这会从样本数据中产生相同的输出。
如果我SQL不识别UNLOAD
(或LOAD
)伪SQL语句的DELIMITER ';'
子句,那么你可以设置运行 脚本之前的环境变量 DBDELIMITER=';'
并从 SQL.