我有一個包含一定數量單詞的字串(它可能從 1 到多個不等),我需要找到包含所有這些單詞的表的記錄以任何順序。
例如,假設我的輸入字串是“黃藍紅”,并且我有一個包含以下記錄的表:
1 yellow brown white
2 red blue yellow
3 black blue red
查詢應回傳記錄 2。
我知道基本方法應該與此類似:
select * from mytable where colors like '%yellow%' and colors like '%blue%' and colors like '%red%'
但是我無法弄清楚如何將字串中的單詞變成單獨的類似引數。
我有這段代碼將字串的單詞拆分成一個表,但現在我被卡住了:
DECLARE @mystring varchar(max) = 'yellow blue red';
DECLARE @terms TABLE (term varchar(max));
INSERT INTO @terms
SELECT Split.a.value('.', 'NVARCHAR(MAX)') term FROM (SELECT CAST('<X>' REPLACE(@mystring, ' ', '</X><X>') '</X>' AS XML) AS String) AS A CROSS APPLY String.nodes('/X') AS Split(a)
SELECT * FROM @terms
任何想法?
uj5u.com熱心網友回復:
首先,將 XML 垃圾放入一個函式中:
CREATE FUNCTION dbo.SplitThem
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN ( SELECT Item = y.i.value(N'(./text())[1]', N'nvarchar(4000)')
FROM ( SELECT x = CONVERT(XML, '<i>'
REPLACE(@List, @Delimiter, '</i><i>')
'</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i));
現在您可以提取表中的單詞,將它們連接到輸入字串中的單詞,并丟棄任何不具有相同計數的單詞:
DECLARE @mystring varchar(max) = 'red yellow blue';
;WITH src AS
(
SELECT t.id, t.colors, fc = f.c, tc = COUNT(t.id)
FROM dbo.mytable AS t
CROSS APPLY dbo.SplitThem(t.colors, ' ') AS s
INNER JOIN (SELECT Item, c = COUNT(*) OVER()
FROM dbo.SplitThem(@mystring, ' ')) AS f
ON s.Item = f.Item
GROUP BY t.id, t.colors, f.c
)
SELECT * FROM src
WHERE fc = tc;
輸出:
| ID | 顏色 | fc | tc |
|---|---|---|---|
| 2 | 紅色 藍色 黃色 | 3 | 3 |
- 示例db<>fiddle
這忽略了任何一方重復的可能性,并忽略了更大的總體問題,即這是存盤事物集的最優化方式。你有一個關系資料庫,使用它!當然你不認為這個問題的標簽存盤在某處作為文字字串
string sql-server-2012 sql-like
當然不是,這些question:tag關系存盤在一個關系表中。拆分字串適用于鳥類和那些擁有各種 CPU 和時間的人。
uj5u.com熱心網友回復:
如果您將分隔串列存盤在單個列中,那么您確實需要將其規范化到單獨的表中。
但是假設您實際上只想進行多次自由格式LIKE比較,您可以針對值串列進行比較:
select *
from mytable t
where not exists (select 1
from (values
('%yellow%'),
('%blue%'),
('%red%')
) v(search)
where t.colors not like v.search
);
理想情況下,您應該將這些值作為表值引數傳遞,然后將其放入查詢中
select *
from mytable t
where not exists (select 1
from @tmp v
where t.colors not like v.search
);
如果您想模擬OR語意而不是AND更改not existstoexists和not liketo like。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/433700.html
