sqlite(LIKE或LIKE)从LIKE获得不同的结果(选择)

时间:2016-03-19 03:02:19

标签: sql sqlite

此查询中有许多参数是用户可调的,而不是直接将它们编辑到sql语句中,我希望用户能够创建一些文本文件,使用{{运行查询1}},并以CSV格式获取结果。问题是,如果我在SQL语句中硬编码select函数,或者导入文本文件并使用select,我会得到不同的结果。

以下是整个SQL文件:

sqlite3 db.sqlite ".read query.sql" > result.csv

注意行

.headers off
.mode csv
CREATE TEMP TABLE IF NOT EXISTS zipcodes(zipcode text primary key);
.import zipcodes.txt zipcodes
CREATE TEMP TABLE IF NOT EXISTS dates(year text primary key);
.import dates.txt dates
CREATE TEMP TABLE IF NOT EXISTS history_codes(code text primary key);
.import history_codes.txt history_codes

.print "CALLSIGN,FIRST,LAST,ADDRESS,BOX,CITY,STATE,ZIP"

select
    DISTINCT
    COUNT(*)
    from PUBACC_EN 
        JOIN PUBACC_HD ON PUBACC_EN.unique_system_identifier = PUBACC_HD.unique_system_identifier 
        JOIN PUBACC_AM ON PUBACC_EN.unique_system_identifier = PUBACC_AM.unique_system_identifier
        JOIN PUBACC_AD ON PUBACC_EN.unique_system_identifier = PUBACC_AD.unique_system_identifier
        JOIN PUBACC_HS ON PUBACC_EN.unique_system_identifier = PUBACC_HS.unique_system_identifier
    WHERE (radio_service_code = "HA" or radio_service_code = "HV")
            and PUBACC_AM.callsign <> ''
            and PUBACC_HS.code LIKE ( select code from history_codes )
            and ( street_address <> '' OR po_box <> '')
            and applicant_type_code == "I" 
            and NOT previous_operator_class <> '' 
            and NOT previous_callsign <> ''
    --      and grant_date like ( select year from dates ) 
            and ( grant_date like "%2015%" or grant_date like "%2016%" ) 
            and zip_code IN ( select zipcode from zipcodes )
    ORDER BY PUBACC_AM.callsign ASC
;

DROP TABLE zipcodes;
DROP TABLE dates;
DROP TABLE history_codes;

日期表包含:

--      and grant_date like ( select year from dates ) 
        and ( grant_date like "%2015%" or grant_date like "%2016%" )

因此它与硬编码行具有相同的项目。如果我使用注释交换语句,我会得到不同数量的记录。我只在这里显示了日期项目,但如果我对zipcodes或history_codes做同样的事情,我会得到不同的结果。

如何允许用户编辑参数的文本文件,然后将该信息导入查询?

谢谢。

1 个答案:

答案 0 :(得分:1)

除非您使用像IN这样的运算符,否则子查询是标量子查询,即只使用第一个结果。 这意味着date like (select ...)date like '%2015%'相同。

要访问所有日期,您必须使用dates表添加联接:

...
JOIN dates ON grant_date LIKE dates.year
...