SQL 服务器在数据中存储通配符
SQL Server storing wildcards in data
我在 SQL 服务器中看到了一个 table,它在实际的 table 数据中包含 %
通配符。即:
Column1 : Column2 : Column3
1 % 2
3 % %
这允许开发人员 运行 like
查询此数据,并且基础数据也将评估为辅助模式匹配。
SELECT * FROM tbl WHERE Column1 LIKE '123'
会 return 没有记录。
SELECT * FROM tbl WHERE Column2 LIKE '123'
将 return 所有记录。
SELECT * FROM tbl WHERE Column3 LIKE '2'
将 return 所有记录。
SELECT * FROM tble WHERE Column3 LIKE '123'
将 return 只有最后一条记录。
我到处查看以了解这是如何实现的,但我只能找到一堆关于 like
查询的信息,其中通配符在查询本身中,而不是在数据中。
- 这个巫术叫什么,我在哪里可以找到文档?
- 其他数据库支持吗?
- 是否在不编写额外代码的情况下在搜索索引(SOLR 或 ElasticSearch)中存在此功能?
更新
所以,与其说是巫术,不如说是我记忆力不佳。反转 like
更有意义。
SELECT * FROM tble WHERE '123' LIKE Column1
我认为 "voodoo" 叫做 or
:
WHERE Column1 LIKE '123' OR Column1 = '%'
OR
是一种非常常见的跨语言结构,因此我希望其他系统(例如 ElasticSearch)也支持它。
Here 是一个 rextester,表明结果是正确的。
正如我在评论中提到的。我特地选择了这个解决方案,因为 OP 提到了一个 "pattern match",让我认为固定模式可以有通配符。这个问题在这一点上有点模棱两可,相反 like
可能是OP的想法。这不是我阅读问题的方式。
你的例子颠倒了。
你需要使用
SELECT * FROM tbl WHERE '123' LIKE Column1
等等
给出你想要的结果(demo)
没有特别的"voodoo"。 LIKE
接受左侧带有匹配表达式的字符串和右侧带有模式的字符串,并且不关心其中一个或两个字符串是否来自列。因此,您需要的文档只是 LIKE
.
的文档
它在我想象的所有 DBMS 中都会以这种方式运行。
但是,虽然该开发人员可能发现它很方便,但所有此类查询都将导致 table 扫描,而不是能够通过搜索更有效地定位所需的行。
如果将操作数的顺序颠倒为LIKE
:
SELECT * FROM tbl WHERE '123' LIKE Column2
将 return 所有记录。
我在 SQL 服务器中看到了一个 table,它在实际的 table 数据中包含 %
通配符。即:
Column1 : Column2 : Column3
1 % 2
3 % %
这允许开发人员 运行 like
查询此数据,并且基础数据也将评估为辅助模式匹配。
SELECT * FROM tbl WHERE Column1 LIKE '123'
会 return 没有记录。
SELECT * FROM tbl WHERE Column2 LIKE '123'
将 return 所有记录。
SELECT * FROM tbl WHERE Column3 LIKE '2'
将 return 所有记录。
SELECT * FROM tble WHERE Column3 LIKE '123'
将 return 只有最后一条记录。
我到处查看以了解这是如何实现的,但我只能找到一堆关于 like
查询的信息,其中通配符在查询本身中,而不是在数据中。
- 这个巫术叫什么,我在哪里可以找到文档?
- 其他数据库支持吗?
- 是否在不编写额外代码的情况下在搜索索引(SOLR 或 ElasticSearch)中存在此功能?
更新
所以,与其说是巫术,不如说是我记忆力不佳。反转 like
更有意义。
SELECT * FROM tble WHERE '123' LIKE Column1
我认为 "voodoo" 叫做 or
:
WHERE Column1 LIKE '123' OR Column1 = '%'
OR
是一种非常常见的跨语言结构,因此我希望其他系统(例如 ElasticSearch)也支持它。
Here 是一个 rextester,表明结果是正确的。
正如我在评论中提到的。我特地选择了这个解决方案,因为 OP 提到了一个 "pattern match",让我认为固定模式可以有通配符。这个问题在这一点上有点模棱两可,相反 like
可能是OP的想法。这不是我阅读问题的方式。
你的例子颠倒了。
你需要使用
SELECT * FROM tbl WHERE '123' LIKE Column1
等等
给出你想要的结果(demo)
没有特别的"voodoo"。 LIKE
接受左侧带有匹配表达式的字符串和右侧带有模式的字符串,并且不关心其中一个或两个字符串是否来自列。因此,您需要的文档只是 LIKE
.
它在我想象的所有 DBMS 中都会以这种方式运行。
但是,虽然该开发人员可能发现它很方便,但所有此类查询都将导致 table 扫描,而不是能够通过搜索更有效地定位所需的行。
如果将操作数的顺序颠倒为LIKE
:
SELECT * FROM tbl WHERE '123' LIKE Column2
将 return 所有记录。