我正在使用 SQL Server 2017。
Description我的表格中有一列可能包含多種顏色。我需要獲取出現在字串中的最后一種顏色。有沒有辦法按照從描述列降序決議的值對其進行排序?
SELECT DISTINCT color
FROM (VALUES ('Dove'), ('Frost')) t(Color)
WHERE 'jgkgh FROST tohjgkhg DOVE gfsgfgs' LIKE CONCAT('%', t.Color, '%')
AND t.Color IS NOT NULL
uj5u.com熱心網友回復:
…
SELECT distinct color , charindex(' ' reverse(color) ' ', ' ' reverse('jgkgh FROST tohjgkhg DOVE gfsgfgs dove frost') ' ') as rvrscharidx
FROM (VALUES('Dove'),('Frost'))t(Color)
WHERE 'jgkgh FROST tohjgkhg DOVE gfsgfgs dove frost' LIKE CONCAT('%',t.Color,'%') AND t.Color IS NOT NULL
order by rvrscharidx
uj5u.com熱心網友回復:
請嘗試以下解決方案。
它使用 XML/XQuery。他們的資料模型基于有序序列。正是我們所需要的。
CROSS APPLY將描述列轉換為 XML 資料型別。- 為了獲取最后一個標記,我們使用以下 XPath 謂詞:
/root/r[last()] - 為了對顏色進行排序,我們使用帶有
order by data($x) descending子句的FLWOR 運算式。
查詢陳述句
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [Description] VARCHAR(255));
INSERT INTO @tbl ([Description]) VALUES
('Blue Black Red'),
('Cyan Green White');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = SPACE(1);
-- without sorting
SELECT t.*
, c.value('(/root/r[last()]/text())[1]', 'VARCHAR(20)') AS lastColor
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA['
REPLACE([Description], @separator, ']]></r><r><![CDATA[')
']]></r></root>' AS XML)) AS tab(c);
-- with sorting
SELECT t.*
, c.value('(/root/r[last()]/text())[1]', 'VARCHAR(20)') AS lastColor
, c
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA['
REPLACE([Description], @separator, ']]></r><r><![CDATA[')
']]></r></root>' AS XML).query('<root>
{
for $x in /root/r
order by data($x) descending
return $x
}
</root>
')) AS tab(c);
沒有排序的輸出
---- ------------------ -----------
| ID | Description | lastColor |
---- ------------------ -----------
| 1 | Blue Black Red | Red |
| 2 | Cyan Green White | White |
---- ------------------ -----------
帶排序的輸出
---- ------------------ -----------
| ID | Description | lastColor |
---- ------------------ -----------
| 1 | Blue Black Red | Black |
| 2 | Cyan Green White | Cyan |
---- ------------------ -----------
uj5u.com熱心網友回復:
未測驗:使用表值函式 STRING_SPLIT()
WITH CTE AS (SELECT value
FROM STRING_SPLIT('jgkgh FROST tohjgkhg DOVE gfsgfgs', ' ', 1))
SELECT TOP 1 *
FROM CTE
WHERE VALUE in ('Dove', 'Frost')
ORDER BY Ordinal Desc
參考示例:
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ', 1);
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15
uj5u.com熱心網友回復:
解決這個問題的最簡單和最快的方法:
-- DDL和樣本資料填充,啟動DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [描述] VARCHAR(255)); INSERT INTO @tbl ([Description]) VALUES ('Red Blue Black'), ('White Green'); -- DDL和樣本資料填充,結束
DECLARE @separator CHAR(1) = SPACE(1);
SELECT t.*, LastColor = RIGHT(t.Description,CHARINDEX(SPACE(1),REVERSE(t.Description)))
FROM @tbl AS t;
回傳:
ID Description LastColor
---- ------------------
1 Red Blue Black Black
2 White Green Green
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/361410.html
標籤:sql-server
上一篇:SQLPivot生成動態列
