代码之家  ›  专栏  ›  技术社区  ›  Alex Terry

SQL Server在数据中存储通配符

  •  1
  • Alex Terry  · 技术社区  · 8 年前

    我在SQLServer中显示了一个表 % 实际表数据中的通配符。IE:

    Column1 : Column2 : Column3
    1        %         2
    3        %         %
    

    这允许开发人员运行 like 对此数据和基础数据的查询也将作为辅助模式匹配进行计算。

    SELECT * FROM tbl WHERE Column1 LIKE '123' 不会返回任何记录。

    SELECT * FROM tbl WHERE Column2 LIKE '123' 将返回所有记录。

    SELECT * FROM tbl WHERE Column3 LIKE '2' 将返回所有记录。

    SELECT * FROM tble WHERE Column3 LIKE '123' 只返回最后一条记录。

    我到处找,看看这是怎么可能的,但我只能找到一堆信息。 喜欢 通配符在查询本身而不是数据中的查询。

    1. 这个巫术叫什么,我在哪里可以找到文件?
    2. 其他数据库支持吗?
    3. 此功能是否存在于搜索索引(solr或elasticsearch)中而不编写额外代码?

    更新 所以,它不像我的可怜的记忆那么多巫毒。反转 喜欢 更有意义。
    SELECT * FROM tble WHERE '123' LIKE Column1

    3 回复  |  直到 8 年前
        1
  •  4
  •   Martin Smith    8 年前

    你的例子倒过来了。

    你需要使用

    SELECT * FROM tbl WHERE '123' LIKE Column1 
    

    等。

    给你想要的结果( demo )

    没有特别的“巫毒”。 LIKE 获取左边有匹配表达式的字符串和右边有模式的字符串,而不关心其中一个或两个字符串是否来自列。所以你需要的文件只是 LIKE .

    在我想象的所有dbms中,它都将以这种方式运行。

    但是,虽然这个开发人员可能已经发现它很方便,但是所有这些查询都将导致表扫描,而不是能够使用seeks更有效地定位所需的行。

        2
  •  2
  •   Ross Presser    8 年前

    如果将操作数的顺序反转为 LIKE :

    SELECT * FROM tbl WHERE '123' LIKE Column2 将返回所有记录。

    见 this demo

        3
  •  2
  •   Gordon Linoff    8 年前

    我认为“伏都教”被称为 or :

    WHERE Column1 LIKE '123' OR Column1 = '%'
    

    OR 是跨语言的一个非常常见的构造,所以我希望其他系统,比如elasticsearch,也支持它。

    Here 是一个显示结果正确的rextester。

    正如我在评论中提到的。我特别选择这个解决方案是因为op提到了一个“模式匹配”,这使我认为固定模式可以有通配符。这个问题在那一点上有点模棱两可,反之亦然 like 可能是手术室想的。我不是这样看这个问题的。