SQL 中 LIKE 和 IN 的替代方案,您无法格式化 s-s-rS 提供的输入选项 [重复]
Posted
技术标签:
【中文标题】SQL 中 LIKE 和 IN 的替代方案,您无法格式化 s-s-rS 提供的输入选项 [重复]【英文标题】:Alternative for LIKE and IN in SQL where you can't format the input options supplied by s-s-rS [duplicate] 【发布时间】:2013-03-03 11:16:06 【问题描述】:我正在处理一个查询,我需要一起使用“LIKE”和“IN”之类的功能,这些值由 s-s-rS 返回,我无法控制如何格式化 s-s-rS 提供的字符串..
我的场景是这样的
SELECT *
FROM suppliers
WHERE supplier_name LIKE IN ('IBM', 'Hewlett Packard', 'DELL', 'Microsoft',)
我想要所有包含“IBM”、“Microsoft”等的供应商名称。
例如:“IBM_ER”、“IBM-PCR”、“EBM_TCC”、“Microsoft-Delta”、“Microsoft-TCC”等。
我将从 s-s-rS 接收选项列表作为参数,其中@Manufacture 由如上所示的字符串组成,我无法控制。
SELECT *
FROM suppliers
WHERE supplier_name LIKE IN (@Manufacturer)
有什么办法可以实现这个目标吗?
【问题讨论】:
@Nikhil 你也可以使用子查询,我很确定。 人们忽视事物的方式很有趣。从我看到的地方,它根本不是重复的。您无法控制上面的 @Parameter 修改。仍然感谢您的一切.. .. @Nikhil,您很难不对您的问题投反对票……咳咳,抱歉,只好把它说出来。我无法理解您“无法控制”的内容以及为什么这些答案对您不起作用。尽管我不熟悉 s-s-rS,但我在 SQL 方面相当不错,如果可以的话,我愿意提供帮助。也许如果您能解释为什么以下答案对您没有帮助,我可以尝试看看我能做什么? SQL 太强大了,我很难相信没有办法为您实现解决方案。 s-s-rS 将参数 (ParamB) 传递给 SQL,并且我以这种格式执行 where 子句“select ... from ... where ColumnA IN (@ParamB)”和 B 基本上包括('Value1', 'Value2', 'Value3'),这一切都是在内部完成的,这就是为什么我说,我无法控制,因为从前端,我只勾选要通过参数传递给 SQL 的选项。 所以我需要在不更改参数的情况下使用 SQL,这对我来说也是新事物,但我正在尝试并寻找想法。 【参考方案1】:好吧,Nikhil,你应该学会的第一件事就是保持冷静。人们在这里为您提供帮助,如果他们不理解您的问题,可能是您错过了发布更多详细信息。
Jarrod 的回答是正确的,但是如果您将 @Manufactor 作为字符串列表,您可以执行以下操作: 拆分字符串,然后将其用作 IN 语句。
首先,如果您没有,请创建一个拆分函数。这是一个例子:https://codereview.stackexchange.com/questions/15125/sql-server-split-function-optimized
然后,像这样修改你的语句。
SELECT *
FROM suppliers
WHERE supplier_name IN (SELECT [value] FROM dbo.fn_Split(@Manufactor,','))
【讨论】:
谢谢 Yves,首先我相信“给予尊重和尊重”的政策,我知道人们是来帮忙的,但也不应该阻止任何人。另外,我喜欢您的解决方案。我喜欢不寻常的问题和他们不寻常的答案。谢谢!! 删除了类似的,是复制/粘贴错字。 @Michael - 现在至少,我知道我必须使用一个函数来拆分参数。休息我可以自己做。我喜欢他的回答,这是当时唯一有效的回答,因为他给了我分裂的想法。【参考方案2】:试试这个
SELECT *
FROM suppliers
WHERE supplier_name like '%IBM%'
or supplier_name like '%Microsoft%'
or supplier_name like '%Hewlett Packard%'
【讨论】:
只有我一个人,还是这似乎不是应该想到的第一个答案? (在工会之前,我的意思是)。我是否忽略了他的帖子? 另外,只是吹毛求疵,但是当“OR”和“AND”在 sql 查询中没有大写(更不用说“LIKE” )? 好吧,这个答案本来可以很好,前提是我可以决定如何生成参数变量。 您只想向查询传递一个参数?假设所有值都用逗号分隔? 没错,因为 s-s-rS 自己抛出这个值,我无法决定或改变它如何将字符串中的值传递给 sql。【参考方案3】:首先,create a split function so you can turn the CSV string to rows of data。
接下来,加入这个函数的结果,用通配符填充分割的结果:
SELECT *
FROM suppliers sup
JOIN dbo.Split(',', @Manufacturer) split
ON sup.supplier_name LIKE '%' + split.s + '%'
【讨论】:
这是我正在寻找的一种非常简洁的方法。尊重并感谢。【参考方案4】:你要找的是UNION
SELECT *
FROM suppliers
WHERE supplier_name LIKE '%IBM%'
UNION
SELECT *
FROM suppliers
WHERE supplier_name LIKE '%Hewlett Packard%'
UNION
SELECT *
FROM suppliers
WHERE supplier_name LIKE '%Microsoft%'
由于您已在问题中添加了详细信息,因此您可以调用存储过程并将名称列表解析为服务器上的动态 SQL 语句,但它会很快变得非常难看,更不用说 SQL 注入向量了沿着那条路走下去。
【讨论】:
Jarrod,你的回答可能很棒,但前提是我可以控制 Parameter,但我没有。 s-s-rS 正在以字符串值格式生成参数,我无法修改。 我猜你运气不好。 我很感激人们告诉我我没有出路,然后人们告诉我我有错误的问题。谢谢!以上是关于SQL 中 LIKE 和 IN 的替代方案,您无法格式化 s-s-rS 提供的输入选项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:Oracle 8i 中 REGEXP_LIKE 函数的替代方案
SQL Server参数化SQL语句中的like和in查询的语法(C#)
SQL Server参数化SQL语句中的like和in查询的语法(C#)