我正在嘗試創建一個 SQL 查詢,向我顯示帶有text1和的訊息text3。我不想展示其他任何東西。我可以找到text1和text1id 2,但因為有來自其他來源的其他訊息,我無法使用 id。我也寧愿將所有內容都放在同一列中,而不是制作 2 列。
select
a.id,
a.message as cur
b.message as next
from
mytable as a
join
mytable as b on a.id = b.id - 2
where
a.message like '%text1%'
我的桌子:
| ID | 來源 | 資訊 |
|---|---|---|
| 01 | 一個 | 文本1 |
| 02 | 一個 | 文本2 |
| 03 | 一個 | 文本3 |
| 04 | 一個 | 文本1 |
| 05 | b | 皰疹病毒 |
| 06 | C | 德普 |
| 07 | 一個 | 文本4 |
| 08 | 一個 | 文本5 |
| 09 | b | 德普 |
| 10 | 一個 | 文本1 |
| 11 | 一個 | 文本6 |
| 12 | 一個 | 文本7 |
輸出應該是這樣的:
| 資訊 |
|---|
| 文本1 |
| 文本3 |
| 文本1 |
| 文本5 |
| 文本1 |
| 文本7 |
或者這也可以,但我更喜歡第一個:
| 資訊 | 資訊 |
|---|---|
| 文本1 | 文本3 |
| 文本1 | 文本5 |
| 文本1 | 文本7 |
uj5u.com熱心網友回復:
這可以通過LEAD決議函式完成,如下所示:
使用兩列結果查詢:
With CTE As (
Select [message], Lead([message], 2) Over (Order by id) As message_1
From Tbl
Where [source]='a'
)
Select [message], message_1
From CTE
Where [message] Like '%text1%'
結果:
| 資訊 | 訊息_1 |
|---|---|
| 文本1 | 文本3 |
| 文本1 | 文本5 |
| 文本1 | 文本7 |
查詢單列結果:
With CTE As (
Select [message], Lead([message], 2) Over (Order by id) As message_1
From Tbl
Where source='a'
)
Select V.[message]
From CTE Cross Apply (VALUES([message]), (message_1)) As V([message])
Where CTE.[message] Like '%text1%'
結果:
| 資訊 |
|---|
| 文本1 |
| 文本3 |
| 文本1 |
| 文本5 |
| 文本1 |
| 文本7 |
uj5u.com熱心網友回復:
很難理解這個問題,但是根據評論中的額外解釋(...我想搜索text1的實體,并從源 a ...中找到并包含相關的訊息文本 2 行),兩種可能的方法得到預期的結果是ROW_NUMBER()和LEAD()。請注意,您需要一個APPLY帶有VALUES表值建構式的附加運算子來取消透視列:
桌子:
SELECT *
INTO MyTable
FROM (VALUES
(01, 'a', 'text1'),
(02, 'a', 'text2'),
(03, 'a', 'text3'),
(04, 'a', 'text1'),
(05, 'b', 'herp'),
(06, 'c', 'derp'),
(07, 'a', 'text4'),
(08, 'a', 'text5'),
(09, 'b', 'derp'),
(10, 'a', 'text1'),
(11, 'a', 'text6'),
(12, 'a', 'text7')
) v (id, source, message)
ROW_NUMBER()帶有和自連接的陳述句:
; WITH cte AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM MyTable
WHERE source = 'a'
)
SELECT c.message
FROM cte a
JOIN cte b ON a.rn = b.rn - 2
CROSS APPLY (VALUES (1, a.message), (2, b.message)) c (rn, message)
WHERE a.message like '%text1%'
ORDER BY a.rn, c.rn
宣告LEAD():
; WITH cte AS (
SELECT *, LEAD(message, 2) OVER (ORDER BY id) AS message2
FROM MyTable
WHERE source = 'a'
)
SELECT c.message
FROM cte a
CROSS APPLY (VALUES (1, a.message), (2, a.message2)) c (rn, message)
WHERE a.message LIKE '%text1%'
ORDER BY a.id, c.rn
結果:
message
-------
text1
text3
text1
text5
text1
text7
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410559.html
標籤:
