[英]reusing result of SELECT statement within a CASE statement sqllite
我想創建一個SQL語句(使用sqllite ..所以我不能使用函數,IF語句等..)重用select語句的結果..這就是它目前的樣子
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的結果,而不是必須創建另一個(幾乎相同的)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
)
基本上我試圖找出一個電子郵件線程是否已經存在傳入的電子郵件..所以我檢查主題是否匹配,如果它匹配,我檢查,看看電子郵件的發件人和收件人是否匹配(在任一方向) ..如果電子郵件線程存在我只插入相同的電子郵件threadID,否則我生成一個新的threadID
更新2:只是為了澄清,我正在尋找一種方法來保存sqllite編譯器兩次進行相同的搜索...而不是簡單地保存輸入(或使其更具可讀性等)
更新3:我想知道是否有一種方法可以讓這個語句返回生成的threadID iff從dbase檢索threadID而不是生成..你可以在這里找到答案
這是構造查詢的另一種方法:
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。 然后在第一個為NULL時運行coalesce
的第二個子句。 您可以在那里生成新的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
子句不返回任何行,而不返回具有NULL值的1行。 所以,為了得到你想要的東西,你可以使用:
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值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.