这是我要获取的数据库中的行:
我想通过执行一个查询来获取所有3行,此id作为过程参数接收,有时我可以接收1个id,有时我可以接收10个id,具体取决于用户向数据库发送的内容。
我写了这样的东西:
SELECT *
FROM Products
WHERE CONVERT(NVARCHAR(MAX), ProductId) LIKE '%' + 'A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667' + '%'
SELECT *
FROM Products
WHERE 'A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667' LIKE '%' + CONVERT(NVARCHAR(MAX), ProductId) + '%'
第二个示例如何返回预期的行而第一个示例不返回任何行?
定义说:%or% finds any values that have "or" in any position
这实际上如何工作?谁能解释?
编辑:
我认为应该在
之类的列上使用此LIKE运算符选择* 从产品 其中ProductId类似于'%'+'SomeStringId'+'%';
因为在WHERE子句中使用了LIKE运算符来搜索列中的指定模式,而我的列为ProductId
,所以我无法理解这样的示例如何工作:
选择* 从产品 其中'SomeStringId'喜欢'%'+ ProductId +'%';
如果在我的列中未使用Like,而在某些字符串上正确使用了该示例,那么上面的示例如何工作...
答案 0 :(得分:1)
您应该拆分字符串,然后使用内部联接。
对于2016年以下的SQL Server,通过XML拆分了繁琐的字符串:
SELECT p.*
FROM products p
INNER JOIN (SELECT arg_xml_node.xml_node.value('(.)[1]', 'uniqueidentifier') uniqueidenfier
FROM (SELECT convert(xml,
concat('<x>',
replace('A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667',
', ',
'</x><x>'),
'</x>')) xml) arg_xml
CROSS APPLY arg_xml.xml.nodes('x') arg_xml_node (xml_node)) arg_uniqueidenfier
ON arg_uniqueidenfier.uniqueidenfier = p.productid;
对于SQL Server 2016及更高版本,使用string_split()
的优雅方式:
SELECT p.*
FROM products p
INNER JOIN (SELECT convert(uniqueidentifier, ltrim(value)) uniqueidenfier
FROM string_split('A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667',
',')) arg_uniqueidenfier
ON arg_uniqueidenfier.uniqueidenfier = p.productid;