目前我们有动态代码,从 UI 输入未知数量的值作为单个变量,例如,用户输入“老虎”、“狮子”和“熊”,这将创建 3 个字符串参数
DECLARE @VARIABLE_1 AS VARCHAR(6) = 'tigers';
DECLARE @VARIABLE_2 AS VARCHAR(5) = 'lions';
DECLARE @VARIABLE_3 AS VARCHAR(4) = 'bears';
然后输入这些变量以查询我们将变量占位符作为逗号分隔列表的位置,即
@VARIABLE_1,@VARIABLE_2,@VARIABLE_3
,我们通常将其与括号和 IN 语句一起使用:
WHERE TABLE.COLUMN IN (@VARIABLE_1,@VARIABLE_2,@VARIABLE_3)
但是,我们想在字符串比较中使用变量,在两端附加通配符而不是完全匹配:
WHERE TABLE.COLUMN LIKE '%'+@VARIABLE_1+'%'
OR TABLE.COLUMN LIKE '%'+@VARIABLE_2+'%'
OR TABLE.COLUMN LIKE '%'+@VARIABLE_3+'%'
这将返回如下数据:
ID | 专栏 |
---|---|
1 | 底特律老虎队 |
2 | 底特律雄狮队 |
4 | Lions and Tigers and Bears oh My! |
7 | 棕熊 |
将参数输入到 SQL 查询中的方式始终相同(即以逗号分隔的变量列表),但变量的数量可以根据用户输入而变化。有没有办法使用 SQL/T-SQL 分解列表来进行字符串比较(利用 SSMS 18)?
我试过使用 WHILE 循环和 STUFF,但是,我意识到它只适用于解析字符串而不是变量列表(
{{C_PARAMETER}}
是输入变量列表的占位符:
WITH cteRecursion(SomeID, OtherID, SingleParam, ParamList) AS
(
SELECT
SomeID,
OtherID,
LEFT(, CHARINDEX(',', {{C_PARAMETER}} + ',') - 1),
STUFF({{C_PARAMETER}}, 1, CHARINDEX(',', {{C_PARAMETER}} + ','), '')
FROM Testdata
WHERE column like '%'+LEFT(, CHARINDEX(',', {{C_PARAMETER}} + ',') - 1)+'%'
UNION all
SELECT
SomeID,
OtherID,
LEFT(ParamList, CHARINDEX(',', ParamList + ',') - 1),
STUFF(ParamList, 1, CHARINDEX(',', ParamList + ','), '')
FROM cteRecursion
WHERE
column like '%'+LEFT(ParamList, CHARINDEX(',', ParamList + ',') - 1)+'%'
AND ParamList > ''
)
我们还可以为每个要进行比较的字符串构建一个参数,但这会降低最终用户的易用性。
如果可能的话,希望在 SQL 中做到这一点!谢谢!