代码之家  ›  专栏  ›  技术社区  ›  Roxy'Pro

SQL Server:仅使用一个where/like运算符按rowid返回多行

  •  -1
  • Roxy'Pro  · 技术社区  · 6 年前

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

    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运算符应该用在我的列like上

    选择* 来自产品 其中productid类似“%”+“somestringid”+“%”;

    因为在where子句中使用like运算符来搜索列中的指定模式,而我的列是 ProductId 所以我不明白这样的例子是怎么起作用的:

    选择* 来自产品 其中“someStringID”如“%”+productID+“%”;

    如果我的专栏没有使用like,而是在某个字符串上使用了它,那么上面的这个例子怎么会起作用呢……

    1 回复  |  直到 6 年前
        1
  •  1
  •   sticky bit    6 年前

    应该拆分字符串,然后使用内部联接。

    对于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