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.

中删除这些子句