SQL Server:仅使用where / LIKE OPERATOR

时间:2019-01-10 20:10:24

标签: sql sql-server sql-like

这是我要获取的数据库中的行:

enter image description here

我想通过执行一个查询来获取所有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,而在某些字符串上正确使用了该示例,那么上面的示例如何工作...

1 个答案:

答案 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;

db<>fiddle