2013-11-23 20 views
2

我創建了一個名爲UserEntry的表,並用tweet數據填充了它。該表下方,這樣你就可以看到在表中的列根據表中現有的屬性在Python中填充SQL表

c.execute("drop table if exists UserEntry") 
UserEntry = """Create table UserEntry 
    (id text, name text, screen_name text,description text, friends_count integer, 
    constraint pk_UserEntry 
    primary key (id) 
    );""" 
c.execute(UserEntry) 

現在,我必須在這取決於是否「SCREEN_NAME」或表中添加另一列(真/假)「描述」屬性包含在其內「名稱」屬性。

c.execute("ALTER TABLE UserEntry ADD contain text").fetchall() 

現在我不知道如何填充字段「包含」。 「包含」字段應如何顯示的示例如下:

ID  Name  Screen_Name  Description     Friends_Count Contain 
001 Chris P  Lady Joker Gossip too good to wait for   234   False 
123 Nas Lope  Nas Lope  This is hilarious. very Funny  45   True 
256 Marsi  Funny Guy I am not a good man, Marsi   456   True 
256 Neila Pets PopSugar  Never expect, never assume   236   False 

任何輸入都將被apprecaited。

回答

0

首先,您必須UPDATE所有當前記錄的包含值:

UPDATE UserEntry 
SET contains = CASE WHEN screen_name LIKE CONCAT('%', name ,'%') 
         OR description LIKE CONCAT('%', name ,'%') 
        THEN True 
        ELSE False 
        END 

Demo on SQLFiddle

然後保持每當新記錄插入或現有記錄你更新contain值的完整性將需要使用TRIGGER s:

CREATE TRIGGER TRG_UserEntry_BeforeInsert BEFORE INSERT ON UserEntry 
FOR EACH ROW 
SET new.contains = CASE WHEN new.screen_name LIKE CONCAT('%', new.name ,'%') 
          OR new.description LIKE CONCAT('%', new.name ,'%') 
         THEN True 
         ELSE False 
         END; 

而且你會編輯一個相同的BEFORE UPDATE也。

查看working demo on SQLFiddle,請注意,我在最後一行做了UPDATE,這就是爲什麼它也顯示contains = 1

由於您使用的是SQLite,因此您不能使用CONCAT(),而是使用'%'||new.name||'%'。並且由於您的contains列的類型爲text,因此您需要使用帶引號的字符串表示TrueFalse

CASE WHEN new.screen_name LIKE '%'||new.name||'%' 
     OR new.description LIKE '%'||new.name||'%' 
    THEN "Y" 
    ELSE "N" 
    END; 
+0

哇!非常感謝,我不擅長SQL和Python,但我不認爲觸發器會這樣做,因爲表格已經填充了除「Contain」列之外的所有內容。我需要基於description&screen_name中的值填充「Contain」列(如果它們包含名稱),並且「contains」必須爲true/false。我們不會在更新中填充「包含」。我希望我有道理。 –

+0

答案更新了,你應該在最初的'UPDATE'後面創建觸發器,否則無論表格中的數據發生什麼變化,你都需要手動更新'UPDATE'所有的'contains'值。 – OGHaza

+0

非常感謝。我會嘗試使用此代碼。在我的情況下,「包含」字段是文本,而不是布爾型,所以在語法上我應該把引號放在「真」和「假」或者應該有等號。再次感謝您的幫助。 –