我有一張這樣的表:
| ID | 描述 | 接受者 |
|---|---|---|
| 1 | 口紅 | 35235 |
| 2 | 悲痛欲絕 | 123、456、2432 |
| 3 | 邏輯推理 | 143243, 34, 2344 |
我想要這樣的輸出:
| ID | 描述 | 接受者 | 收件人編號 |
|---|---|---|---|
| 1 | 口紅 | 35235 | 35235 |
| 2 | 悲痛欲絕 | 123、456、2432 | 123 |
| 3 | 邏輯推理 | 143243, 34, 2344 | 143243 |
我需要使用收件人 ID 加入收件人資料表。值得慶幸的是,該行中的每個收件人所需的資料都是相同的,因此我只需要一個 ID。我想回傳相同的資料,除了收件人列中每一行的第一個(甚至只有一個)ID。
我目前的方法是這樣的:
SELECT Id,
Description,
Recipient,
MAX(value) as RecipientID
FROM msg
CROSS APPLY STRING_SPLIT(Recipient, ',')
GROUP BY Id, Description, Recipient
雖然此方法為我提供了一個單獨的收件人 ID,然后我可以將其用作密鑰,但由于收件人列可能在一個單元格中包含大于 2k 的 ID 串列,因此需要很長時間。
我嘗試了一個 REGEX 解決方案來提取分隔符前面的起始數字集,但我找不到一種不被用作過濾器的方法。
如果 SQL Server 有類似 MySQL 的功能SUBSTRING_INDEX來獲取第一個 ID,那就太好了,但事實并非如此。
我怎么能只回傳每個收件人單元格的一個元素而不必進行 aCROSS APPLY和聚合?
uj5u.com熱心網友回復:
您可以按如下方式使用基本字串函式:
SELECT Id, Description, Recipient,
SUBSTRING(Receipient ',', 1, CHARINDEX(',', Recipient ',') - 1) AS RecipientId
FROM msg;
這個答案使用了一個技巧,在 的末尾添加一個逗號Recipient,這樣CHARINDEX就總能找到它。
uj5u.com熱心網友回復:
也可以使用 Case 陳述句獲得所需的結果
SELECT [ID],[Description],[Recipient],SUBSTRING([Recipient],0,case CHARINDEX(',',[Recipient])
when 0 then len([Recipient])
else CHARINDEX(',',[Recipient])
end) AS RecipientID
FROM [customer].[dbo].[msg ];
通常,建議將接收者值存盤在具有一對多關系的新表中。每個值都存盤在一個新行中以避免使用分隔符。但是,此查詢適用于您的用例
uj5u.com熱心網友回復:
(SELECT TOP value FROM STRING_SPLIT(Recipient, ', ')) as RecipientId
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389549.html
標籤:sql sql-server 查询语句
上一篇:基于ID的關系中的SQL更新順序
下一篇:基于引數的LAG和LEAD
