2016-03-19 15 views
1

Bu sorguda, kullanıcı tarafından ayarlanabilen ve bunları doğrudan sql deyimine düzenlemeden çok sayıda parametre vardır, kullanıcının olmasını istiyorum. Birkaç metin dosyası oluşturabilir, sorguyu sqlite3 db.sqlite ".read query.sql" > result.csv ile yürütebilir ve sonuçları bir CSV olarak alabilirsiniz. Sorun, SQL deyiminde select işlevlerini sabit kodlamanız veya metin dosyalarını içe aktarıp bir seçim kullanmam durumunda farklı sonuçlar almamdır.sqlite (LIKE veya LIKE) LIKE'dan farklı sonuçlar alma (select)

.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; 

Bildirimi

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

tarih tablosu içeren satırlar:

sqlite> select * from dates; 
%2015% 
%2016% 

yüzden sert oluşturulan kodlanmış aynı öğeleri olan İşte

bütün SQL dosyasıdır hat. Yorumlar kullanarak ifadeleri takas edersem farklı sayıda kayıt alırım. Sadece burada tarih öğelerini gösterdim, ancak aynı şeyi zipcodes veya history_codes ile de yaparsam farklı sonuçlar elde ederim.

Kullanıcıların parametreler için metin dosyalarını düzenlemelerine ve sonra bu bilgileri sorguya almasına nasıl izin verebilirim?

Teşekkür ederiz.

cevap

1

IN gibi bir operatör kullanmıyorsanız, bir alt sorgu bir skaler alt sorgudır, yani yalnızca ilk sonuç kullanılır. Bu, date like (select ...)'un yalnızca date like '%2015%' ile aynı olduğu anlamına gelir.

tüm tarihler erişmek için, bir dates tabloyla katılmak eklemek zorunda:

... 
JOIN dates ON grant_date LIKE dates.year 
... 
+0

Bu mükemmel çalıştı. Bunu neden daha önce düşünmediğimi bilemiyorum, çok uzun süredir bakmamın dışında. ;) Şerefe. –