我希望在使用 WHERE 子句基礎 @USER_ID 在我的 SQL 服務器查詢中記錄的用戶輸入時設定一個條件,但我想我在這里遺漏了一些重要的東西。
DECLARE @USER_ID NVARCHAR(255) = 'a,b,c' -- will be multi-select parameter; can be null as well
select * from <table_name>
{
if: @USER_ID is NULL then no WHERE condition
else: WHERE <table_name>.<col_name> in (SELECT item FROM SplitString(@USER_ID,','))
}
有人可以在這里幫忙嗎?
uj5u.com熱心網友回復:
就個人而言,我建議切換到表型別引數,那么您根本不需要使用STRING_SPLIT。不過,我不打算在這里介紹所述型別引數的創建;已經有很多了,檔案也足以解釋它。
至于問題,如果我們要使用,STRING_SPLIT您將使用如下方法:
SELECT {Your Columns} --Don't use *
FROM dbo.YourTable YT
WHERE YT.YourColumn IN (SELECT SS.Value
FROM STRING_SPLIT(@USER_ID,',') SS)
OR @USER_ID IS NULL
OPTION (RECOMPILE);
子句中的RECOMPILEinOPTION很重要,因為@USER_ID具有值的查詢NULL可能與沒有值的查詢大不相同。
您可以使用動態 SQL 方法,但對于一個引數,我懷疑除了微不足道的好處之外還有更多其他東西。使用上述內容也更容易讓其他人理解,并且每次運行查詢時生成計劃的成本對于這樣一個簡單的查詢來說應該很小。
使用表型別引數,YourColumn使用UNION ALL如下查詢實際上可能會更高效(假設您有可用的索引):
SELECT {Your Columns} --Don't use *
FROM dbo.YourTable YT
JOIN @Users U ON YT.YourColumn = U.UserId
UNION ALL
SELECT {Your Columns} --Don't use *
FROM dbo.YourTable YT
WHERE NOT EXISTS (SELECT 1 FROM @Users U);
uj5u.com熱心網友回復:
你可以避免STRING_SPLIT在這里完全使用:
WHERE ',' @USER_ID ',' LIKE '%,' <table_name>.<col_name> ',%'
uj5u.com熱心網友回復:
如果@UserID 為NULL,則執行條件(1=1),這始終為真。如果@UserID 不為NULL,則執行OR 條件,其中(a, b, c) 中的所有<col_name> 都存在。
SELECT *
FROM <table_name>
WHERE (1=1)
AND ((@USER_ID IS NULL AND (1=1)) -- always true
OR (<table_name>.<col_name> in (SELECT [value] FROM SplitString(@USER_ID,',')))
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/371059.html
標籤:sql-server 查询语句 if 语句 where子句
上一篇:有沒有辦法在Java中進行24小時格式和60分鐘格式?
下一篇:嵌套ifelse條件
