我有以下格式的文本字串:
09/05/2021: La persona seleccionada se encuentra en seguridad 05/09/2021: Se envia un nuevo grupo de candidatos 07/11/2021: El candidato contratado no inicia
所以我想按每個日期將每個評論與字串分開。我怎么做?
結果應如下所示:
| 日期 | 評論 |
|---|---|
| 09/05/2021 | La persona seleccionada se encuentra en seguridad |
| 05/09/2021 | 新的候選人群 |
| 07/11/2021 | El candidato contratado no inicia |
uj5u.com熱心網友回復:
我不喜歡依賴于 SPLIT 輸出順序的解決方案,因為手冊指出它不能保證是輸入順序.. 在實踐中我相信它在幕后使用 .NET 的拆分,并且可能會按順序輸出..
買者自負!
declare @t VARCHAR(200) = '09/05/2021: La persona seleccionada se encuentra en seguridad 05/09/2021: Se envia un nuevo grupo de candidatos 07/11/2021: El candidato contratado no inicia';
WITH x AS (
SELECT
RIGHT(LAG(value) OVER(order by (select null)), 10) as d,
SUBSTRING(value, 2, LEN(value) - CASE WHEN value LIKE '%__/__/____' THEN 11 ELSE 1 END) as t
FROM
string_split(@t, ':')
)
SELECT d, t FROM x WHERE d IS NOT NULL
這將拆分:,然后檢索“上一個”值末尾的日期,以便與當前值中的文本配對。在決定是將子串到字串末尾還是從字串末尾回傳最多 10 個字符之前,它會檢查末尾是否有日期
如果您想在 SQLS 中更安全地執行此操作,最好使用遞回 CTE 和 SUBSTRING 和 CHARINDEX 來逐步查找 的位置': ',然后從 10 個字符切回,直到下一個索引。
看起來像這樣:
declare @t VARCHAR(200) = '09/05/2021: La persona seleccionada se encuentra en seguridad 05/09/2021: Se envia un nuevo grupo de candidatos 07/11/2021: El candidato contratado no inicia';
WITH x(s, sp, p) as (
SELECT s, 1, CHARINDEX(': ', s) FROM (SELECT @t AS s) xx
UNION ALL
SELECT s, p 1, CHARINDEX(': ', s, p 1)
FROM X
WHERE p > 0
)
SELECT
SUBSTRING(s, sp - 11, 10) d,
SUBSTRING(s, sp 1, CASE WHEN p > 0 THEN p - sp - 12 ELSE LEN(s) END) c
FROM x
WHERE sp > 1
遞回 CTE 反復使用 CHARINDEX 來查找': '并在每次回圈時有效地給出起始位置 (sp) 和結束位置 (p)。以上次的位置作為本次的起始位置,對字串進行增量搜索。從這些中,可以使用根據日期調整索引的因素,對于評論也是如此。做一個select * FROM x,如果你想看到更多資訊
在前端語言中這樣做會更安全,例如C#確實保證拆分順序,這個邏輯類似:
var a = string.Split(": ");
for(int i = 1; i < a.Length - 1; i )
Console.WriteLine( (a[i-1][^10..], a[i][..^11]) );
Console.WriteLine( (a[^2][^10..], a[^1]) );
這種變化在 上分裂": ",這是 SQLS 無法做到的,這減少了從一開始就修剪無關空間的需要。之后,回圈從 1 開始處理除最后一行(它沒有日期,因此必須區別對待)以外的所有內容(因此它可以安全地參考前一個元素)。
a[i-1][^10..]表示陣列a,元素字串 ati-1,子字串 10 從末尾到 0 從末尾即最后 10 個字符a[i][..^11]表示陣列a、元素i、子串從開始到結束的 11 個字符,即除最后 11 個字符外的所有字符a[^2][^10..]表示陣列a,從末尾開始的第 2 個元素,即最后一個,最后 10 個字符a[^1]表示陣列a,最后一個元素
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/369572.html
標籤:sql sql-server 细绳 分裂
上一篇:powershellpsobject顯示為字串而不是psobject,如何轉換回psobject
下一篇:字串格式和Tex渲染
