2012-12-27 135 views
1

我想創建一個SQL語句(使用sqllite ..所以我不能使用函數,IF語句等),它重用select語句的結果.. this就是它目前看起來像在CASE語句中重用SELECT語句的結果sqllite

INSERT INTO search_email(many_fields, threadid) VALUES ('many_fields', 
    CASE 
    WHEN 
      (
       (SELECT COUNT(tableX.threadid) %threadIDquery% 
       ) > 0 
      ) 
    THEN 

       (SELECT tableX.threadid %threadIDquery% LIMIT 1) 

    ELSE 
      0 
    END 
) 

我想要重用結果的第一選擇具有再拍(幾乎相同)select語句來代替。

更新:對於那些想知道什麼,我試圖做的。這裏是查詢的完整版本:

INSERT INTO search_email(meta, subject, body, sender, tos, ccs, folder, threadid) VALUES ('meta1','subject1','body1','sender1', 'tos1',' ccs1','folder1', 
    CASE 
    WHEN 
      (
       (SELECT COUNT(search_email.threadID) FROM search_email 
                  WHERE search_email.subject MATCH '%query%' AND 
                  (
                   (search_email.sender = '%sender' AND search_email.tos = '%receiver%') 
                   OR 
                   (search_email.sender = '%receiver%' AND search_email.tos = '%sender%') 
                  ) 
       ) > 0 
      ) 
    THEN 

      (SELECT search_email.threadID FROM search_email 
                 WHERE search_email.subject MATCH '%query%' AND 
                 (
                  (search_email.sender = '%sender%' AND search_email.tos = '%receiver%') 
                  OR 
                  (search_email.sender = '%receiver%' AND search_email.tos = '%sender%') 
                 ) LIMIT 1 
      ) 

    ELSE 
      //generate new thread ID 
    END 
) 

基本上我試圖找出如果電子郵件線程已經存在對於傳入的電子郵件..所以我檢查主題是否匹配,如果是這樣,我檢查電子郵件的發件人和收件人是否匹配(在任一方向)..如果電子郵件線程存在我只是插入相同的電子郵件線程ID ,否則我生成一個新的線程ID

更新2:只是爲了澄清,我正在尋找一種方式來作出相同的兩次搜索保存sqllite編譯器..而不是簡單地節省了輸入(或使其更具可讀性等)

更新3:我在想,如果有此語句返回生成的線程ID的方式當且僅當該線程ID是從質數據庫檢索,而不是生成的..你可以找到答案here

+0

這是試圖做什麼?我可以看到你的答案如何解析數據,但我不認爲它實際上正在做你所需要的。 –

+0

更新的問題,以解決您的意見 – abbood

+0

它是SQL Server或SQLite?您知道,即使您設法將查詢的鍵入保存兩次,查詢也會運行兩次,併產生可能不同的結果,對吧? –

回答

3

這是結構化查詢的另一種方式:

INSERT INTO search_email(meta, subject, body, sender, tos, ccs, folder, threadid) 
    SELECT 'meta1', 'subject1', 'body1', 'sender1', 'tos1', 'ccs1', 'folder1', 
      coalesce((SELECT search_email.threadID 
         FROM search_email 
         WHERE search_email.subject MATCH '%query%' AND 
          ((search_email.sender = '%sender%' AND search_email.tos = '%receiver%') OR 
          (search_email.sender = '%receiver%' AND search_email.tos = '%sender%') 
          ) 
         LIMIT 1 
        ), 
        <generate new thread id here> 
        ) 

這是使用一個select而不是values。它獲取匹配條件的線程ID,如果沒有匹配,則獲得NULL。​​3210的第二個子句在第一個爲NULL時運行。你可以在那裏生成新的ID。

我確實有這個方法的問題。對我來說,你應該有一個管理線程的Thread表。 ThreadId應該是此表中的自動增量ID。電子郵件表然後可以引用這個ID。換句話說,我認爲需要更詳細地考慮數據模型。

下面的查詢將無法查詢工作,但它給人的線程移動到子查詢的想法:

INSERT INTO search_email(meta, subject, body, sender, tos, ccs, folder, threadid) 
    SELECT 'meta1', 'subject1', 'body1', 'sender1', 'tos1', 'ccs1', 'folder1', 
      coalesce(t.threadID, 
        <generate new thread id here> 
        ) 
    from (SELECT search_email.threadID 
      FROM search_email 
      WHERE search_email.subject MATCH '%query%' AND 
       ((search_email.sender = '%sender%' AND search_email.tos = '%receiver%') OR 
       (search_email.sender = '%receiver%' AND search_email.tos = '%sender%') 
       ) 
      LIMIT 1 
     ) t 

它不會工作的原因是因爲from條款將不返回行,而不是1具有NULL值的行。所以,爲了得到你想要的,你可以使用:

from (SELECT search_email.threadID 
      FROM search_email 
      WHERE search_email.subject MATCH '%query%' AND 
       ((search_email.sender = '%sender%' AND search_email.tos = '%receiver%') OR 
       (search_email.sender = '%receiver%' AND search_email.tos = '%sender%') 
       ) 
      union all 
      select NULL 
      order by (case when threadId is not null then 1 else 0 end) desc 
      LIMIT 1 
     ) t 

這確保了當沒有線程時返回NULL值。

+0

*嘆* *我知道你的意思.. [理想情況下](http://www.jwz。org/doc/threading.html)我根本不會使用數據庫來解決這個問題(例如電子郵件線程)。當客戶有一個他們聰明的東西,當他們繼續縮短開發時間時,會發生這種情況..雖然謝謝! – abbood

+0

oright它的工作原理!正確的答案授予.. +1 b/c你看起來像一個好人 – abbood

+0

後續問題:有沒有辦法讓這個sql語句只返回threadID只有當它從表中提取..而不是生成? – abbood