我有 {taskId}={owner} 形式的 T-SQL 記錄,我想將它們分成 taskId 和所有者的記錄(在單獨的欄位中)。我發現了一個類似問題的解決方案激發了這段代碼的靈感,該代碼似乎已經完成了 95%
SELECT [taskId]= LEFT(s.owner, ca.pos - 1),
[owner] = SUBSTRING(s.owner, ca.pos 1, 888000)
FROM (SELECT [GROUP_TASK_IDS] from [mydb][MyGroupTasks) s
CROSS APPLY (VALUES(CHARINDEX('=', s.owner))) ca(pos)
嵌套的(SELECT...) s正在回傳預期的記錄,所以我認為 CROSS APPLY 提供了一種類似連接的機制來將該函式應用于記錄集中的每個記錄,然后將其提供給外部 SELECT。我對 CROSS APPLY 有什么誤解,我如何更正我的用法,以從 {taskId}={owner} 形式的 SELECT 字串記錄回傳 taskId 和所有者的表?
uj5u.com熱心網友回復:
我假設以下示例資料:
CREATE TABLE MyGroupTasks ([GROUP_TASK_IDS] VARCHAR(100) PRIMARY KEY)
INSERT INTO dbo.MyGroupTasks (GROUP_TASK_IDS)
VALUES ('{123}={456}'),('{a}={bc}')
在這種情況下,我只 AS owner在您的查詢中添加了它以使其有效:
SELECT [taskId]= LEFT(s.owner, ca.pos - 1),
[owner] = SUBSTRING(s.owner, ca.pos 1, 888000)
FROM (SELECT [GROUP_TASK_IDS] AS owner from MyGroupTasks) s
CROSS APPLY (VALUES(CHARINDEX('=', s.owner))) ca(pos)
它產生以下結果:
taskId owner
------------------------------ ------------------------------
{123} {456}
{a} {bc}
(2 rows affected)
如果你想要這些結果:
taskId owner
------------------------------ ------------------------------
123 456
a bc
(2 rows affected)
以這種方式更改您的查詢:
SELECT [taskId]= SUBSTRING(s.owner, 2, ca.pos - 3),
[owner] = SUBSTRING(s.owner, ca.pos 2, LEN(s.owner)-ca.pos-2)
FROM (SELECT [GROUP_TASK_IDS] AS owner from MyGroupTasks) s
CROSS APPLY (VALUES(CHARINDEX('=', s.owner))) ca(pos)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323270.html
標籤:查询语句
