我閱讀了檔案和一些類似this和this的問題。我仍然有一些問題要讓我的查詢正常作業。
在我的表中,我有一個varchar包含用逗號分隔的值的欄位。實際值的示例是:
- T1
- T1、T3、T11、T12
- T26、T1、T11
- T18, T1
- T2、T3
注意:空格可以存在也可以不存在。
我的查詢必須找到所有的記錄,比如說,T1在這個欄位中但不是 T11。在上述情況下,應回傳所有前 4 行。
我知道運算子的模式LIKE是使用占位符%,_和定義[]的[^]。
但:
%T1%還發現T11,T12, 等等...%T1僅當T1是最后一項時才有效T1僅當T1是唯一的專案時才有效T1%僅當T1是第一項時才有效
所以我最終得到了這個查詢:
field LIKE '%T1' OR field LIKE 'T1,%' OR field LIKE '%,T1,%`
第一個子句查找T1它是唯一的專案還是最后一個專案。第二個子句T1判斷它是否是第一項。最后一個子句查找T1它是否在其他專案的中間。
T1 , T2但如果有空格(即),它就不起作用。我應該添加所有其他情況......這對我來說似乎有點難看。有沒有更優雅的方式來實作相同的目標?
uj5u.com熱心網友回復:
如果替換所有空格,則在列中添加前導和尾隨分隔符,例如
CONCAT(',', REPLACE(field, ' ', ''), ',')
轉換T1, T3, T11, T12成,T1,T3,T11,T12,
然后,您可以通過添加額外的分隔符來搜索,T1,開始和結束情況,例如
WHERE CONCAT(',', REPLACE(field, ' ', ''), ',') LIKE '%,T1,%';
或者,如果您使用的是支持它的 SQL Server 版本,您可以使用:
WHERE EXISTS
( SELECT 1
FROM STRING_SPLIT(Field, ',') AS ss
WHERE TRIM(ss.value) = 'T1'
);
我不希望這會表現得LIKE更好
db<>fiddle 上的示例
uj5u.com熱心網友回復:
您可以洗掉空格并在開頭和結尾添加逗號。
WHERE
(',' REPLACE(field, ' ', '') ',') LIKE '%,T1,%`
uj5u.com熱心網友回復:
您可以替換掉空格字符以幫助清理:
WHERE
(
REPLACE(field, ' ', '') LIKE '%,T1'
OR REPLACE(field, ' ', '') LIKE 'T1,%'
OR REPLACE(field, ' ', '') LIKE '%,T1,%'
)
uj5u.com熱心網友回復:
這應該可以在沒有替換的情況下作業
select * from
(values ('T1'),
('T1, T3, T11, T12'),
('T18, T1'),
('T18, T11'),
('T2, T3'))
as X(field )
where field like '%T1[^0-9]%'
or field like '%T1'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461481.html
