isql"选择...其中'列值的一部分' ='列值的一部分'

时间:2016-02-12 10:31:47

标签: where-clause informix isql

我有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,这使得找到一个可行的解决方案变得不容易,因为不支持许多功能......

非常感谢任何帮助!

2 个答案:

答案 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)||'%';