你能幫我按復雜的邏輯選擇一個句子嗎?平臺:TSQL。
初始資料:
| 句子 | 結果 |
|---|---|
| 公司“Apple corp”的標識上有一個蘋果 | 1 |
| 公司“蘋果電腦”是一家大公司 | 0 |
| 蘋果公司 | 1 |
條件:
- 必須有 %Apple%
- 不考慮 %"%Apple%"% 這意味著:如果句子只有 %"%Apple%"%,條件不滿足 但是如果句子同時有 %Apple% AND %"%Apple%"% - 條件滿足
我試圖應用一些邏輯:
首先:
- 用一些罕見的符號代替“Apple”這個詞。例如。“|”
- 洗掉句子中除|以外的所有符號 和報價
- 尋找“|” 符號,并從它向左和向右看。如果其中一方沒有報價,則條件滿足。
二:
根據Apple這個詞拆分句子
第三:
根據引號拆分句子
但是我是否不知道如何在技術上實作邏輯,或者邏輯不符合目標。
uj5u.com熱心網友回復:
如果您真的必須使用 sql,只需在 WHERE 子句中使用多個條件即可。這樣,您不必呼叫函式進行替換或其他操作。
您可以這樣改寫您的條件:
- 文本僅包含 Apple 但不包含“Apple”
或 - 文本同時包含 Apple 和“Apple”
- 可能性1:第一個蘋果,然后是“蘋果”
- 可能性2:先是“蘋果”,然后是蘋果
WHERE
(Col LIKE '%apple%' AND Col NOT LIKE '%"%apple%"%') -- APPLE, but not "APPLE"
OR Col LIKE '%apple%"%apple%"%' -- APPLE .. "APPLE" ..
OR Col LIKE '%"%apple%"%apple%' -- "APPLE" .. APPLE ..
db<>小提琴
uj5u.com熱心網友回復:
您的示例資料和解釋似乎只需要以下內容,這對您有用嗎?
with d as (
select 'company "Apple corp" has an apple on its logotype 1' sentence union
select 'company "Apple computers" is a large company 0' union
select 'Apple company'
)
select * , case when Replace(Replace(sentence,'"apple',''),'apple"','') like '%apple%' then 1 else 0 end
from d;
uj5u.com熱心網友回復:
我通過應用這個邏輯解決了這個問題。
- 用“|”代替蘋果
- 從句子中洗掉除“|”之外的所有字符 和 '”'
- 將 '"' 替換為 '""'。處理一個參考屬于 2 個單詞 '"Apple"Apple"' 的情況
- 從句子中洗掉所有字符'|' 用引號覆寫。
- 選擇包含'|'的句子
首先,我們應該為第 2 點創建函式。
create function [dbo].[fn_KeepCharacters](@String varchar(2000), @KeepValues varchar(255))
returns varchar(2000)
as
begin
set @KeepValues = '%[' @KeepValues ']%'
while patindex(@KeepValues, @String) > 0
set @String = stuff(@String, patindex(@KeepValues, @String), 1, '')
return @String
end
go
完整代碼:
with d as (
select 'big company "Apple"' col
union select 'Apple, start'
union select 'comp Apple" computers'
union select 'inc " int Apple ap'
union select '"i Apple""mac Apple" aa'
union select 'book "pen Apple"pineApple"'
union select 'leaf Apple"Apple"'
)
--, b as (
select col, case when replace(replace(dbo.fn_KeepCharacters(replace(col, 'Apple', '|'), '^"|'), '"', '""'), '"|"', '""')
like '%|%' then 1 else null end
col_sec
from d
我感謝 stackoverflow 成員的幫助。特別是,@Stu 的嵌套替換建議。
問題是 fn_KeepCharacters 包含 while circle 非常慢。我將欣賞更快的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481352.html
上一篇:使用NOTIN子句時SELECTDISTINCT是否與SELECT不同?
下一篇:兩位數字范圍正則運算式
