我有一個帶有WHERE子句的SELECT陳述句,它使用了一個LIKE通配符,其運算式來自一個變數字串,我使用一個表中的值建立了這個字串。然而,雖然沒有錯誤,但查詢沒有正確評估,沒有給出預期的結果,因為它正在回傳所有的結果記錄,沒有應用LIKE通配符中的條件。所期望的結果應該是回傳更少的記錄,因為它們將根據LIKE通配符運算式被過濾。
我建立的用于SQL查詢的LIKE通配符的變數是以下內容,以及字串的值:
Declare @TrimmedAgeType Varchar(450);
該值是這樣的。'%J%' AND PERM.AgeFilter NOT LIKE '%JS%'/code>
該SQL查詢看起來像這樣:
SELECT * FROM #MembershipInfo #SP
INNER JOIN TRP_ME_PriceStructure PERM
ON #PSP.MembershipPriceStructurePK = PERM.MembershipPriceStructurePK
WHERE PERM.AgeFilter NOT LIKE @TrimmedAgeType
當我用下面的字串值對查詢進行硬編碼時,我得到了預期的回傳結果。
SELECT * FROM#MembershipInfo #PSP
INNER JOIN TRP_ME_PriceStructure PERM
ON #PSP.MembershipPriceStructurePK = PERM.MembershipPriceStructurePK
WHERE PERM. AgeFilter NOT LIKE '%J%' AND PERM. AgeFilter NOT LIKE '%JS%'。
如果你想知道我是如何初步建立字串變數值的,請看下面的內容:
Declare @AgeType Varchar(450)。
Declare @AgeReference varchar(450)
SET @AgeType = CONCAT(@AgeType, ''%' @AgeReference '%'') 'and PERM.AgeFilter NOT LIKE ')
附加資訊:
這個@AgeType變數是在一個 while 回圈中生成的,該回圈正在回圈瀏覽一個表格,該表格的內容為
回圈中生成的,該回圈正在回圈瀏覽一個年齡參考表。后來我把
變數的名稱為@TrimmedAgeType,因為我對它做了一些額外的作業以移除最后出現的
' AND PERM.AgeFilter NOT LIKE '
更多資訊。
我有一個會員表,AgeFilter列包含字母參考('A,U,J,C,JS'等)。我想回傳所有與LIKE通配符模式中給出的參考不匹配的結果。這是因為SELECT查詢實際上將是一個DELETE查詢,我將洗掉所有回傳的、與LIKE通配符模式中的給定參考不匹配的記錄。
希望有人能提供幫助。謝謝你。
希望有人能幫助我。
uj5u.com熱心網友回復:
假設我們有一些過濾器存盤在這里:
CREATE TABLE dbo.FilterPatterns
(
PatternID int PRIMARY KEY,
FilterPattern varchar(32) NOT NULL UNIQUE >。
);
為了模擬這個問題,假設我們知道我們要找的PatternID值是1和3:
INSERT dbo.FilterPatterns(PatternID, FilterPattern)
VALUES(1,'%J%'/span>), (2,'%Q%'), (3,'%JS%')。
我們有一些成員存盤在一個#temp表中,原因不明(如何填充的?
CREATE TABLE #MembershipInfo
(
MembershipPriceStructurePK int PRIMARY KEY
);
讓我們插入幾條匹配和不匹配的記錄(注意:30在核心表中不存在)。
INSERT #MemberShipInfo VALUES(5), (10), (15), (20), (30)。
其中兩個將在核心表中有匹配的年齡過濾器,另外兩個將沒有。我們還將添加一條不在臨時表中的行(25):
CREATE TABLE dbo.TRP_ME_PriceStructure
(
MembershipPriceStructurePK int PRIMARY KEY,
AgeFilter varchar(256)
);
INSERT dbo.TRP_ME_PriceStructure VALUES 5,'foo'), (10,'BobJoined'), (15, 'blat'),(20,'NodeJS'),(25,'funky') 。
現在我們的查詢只需針對過濾模式表做一個NOT EXISTS,使用你目前使用的任何邏輯從該表中提取值來構建字串:
SELECT * FROM #MembershipInfo #P
INNER JOIN dbo.TRP_ME_PriceStructure PERM
ON #PSP.MembershipPriceStructurePK = PERM.MembershipPriceStructurePK
WHERE NOT EXISTSSELECT 1 FROM)
dbo.FilterPatterns AS fp
WHERE fp.PatternID IN (1,3)
and PERM.AgeFilter LIKE fp.FilterPattern)。)
- 成員5和15被回傳
- 成員10和20被回傳。
- 成員10和20被排除在外,因為它們符合過濾器的要求 。
- 成員25和30被排除在外,因為他們錯過了連接 。
uj5u.com熱心網友回復:
嘗試硬編碼通配符
SELECT * FROM#MembershipInfo #PSP
INNER JOIN TRP_ME_PriceStructure PERM
ON #PSP.MembershipPriceStructurePK=
PERM.MembershipPriceStructurePK
WHERE PERM. AgeFilter NOT LIKE '%' @TrimmedAgeType '%'
uj5u.com熱心網友回復:
使用動態SQL,我已經成功地撰寫了查詢,回傳給我預期的結果:
DECLARE @DeleteUnsuitableMemberships varchar(MAX)
SET @DeleteUnsuitableMemberships =
'DELETE #MembershipInfo FROM #MembershipInfo #PSP
INNER JOIN TRP_ME_PriceStructure PERM
ON #PSP.MembershipPriceStructurePK = PERM.MembershipPriceStructurePK
WHERE PERM.AgeFilter NOT LIKE ' @TrimmedAgeType
EXEC(@DeleteUnsuitableMemberships)
我所做的是:
- 宣告一個新的會員資格。
- 宣告一個新的變數。
- 將該變數設定為我用撇號(')包裝的SQL查詢。
- 使用
運算子添加該變數。 - 使用
EXEC()函式,將變數作為一個引數放在里面。
@TrimmedAgeType的值仍然是'%J%' AND PERM.AgeFilter NOT LIKE '%JS%'
感謝大家的幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/311072.html
標籤:
下一篇:過濾帶有陣列的物件
