我必须编写一个简单的查询,在其中查找以 B 或 D 开头的人名:
SELECT s.name
FROM spelers s
WHERE s.name LIKE 'B%' OR s.name LIKE 'D%'
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法重写它以提高性能。所以我可以避免or
和/或like
?
postgresql index regular-expression pattern-matching string-searching
我正在努力提高我的词汇量,以便更好地与我的开发人员交流。我们在站点中有几个地方正在讨论是否应该从头开始搜索字符串,还是应该在字符串中的'running%'
任何位置搜索'%running%
。
我一直将中间搜索称为“模糊”,我意识到这是不正确的,因为模糊意味着改变单词“run”、“runing”[原文如此]、“runed”[原文如此]的形式。
搜索字符串开头和搜索字符串中间的正确术语是什么?
如何patindex
在表格或变量中找到所有位置?
declare @name nvarchar(max)
set @name ='ali reza dar yek shabe barani ba yek '
+ 'dokhtare khoshkel be disco raft va ali baraye'
+ ' 1 saat anja bud va sepas... ali...'
select patindex('%ali%',@name) as pos
Run Code Online (Sandbox Code Playgroud)
这会返回1
但我想要所有结果,例如:
pos
===
1
74
113
Run Code Online (Sandbox Code Playgroud) 我想查看一个表是否包含给定字符串的任何子字符串。
假设我有一个字符串
somedomain.com
Run Code Online (Sandbox Code Playgroud)
在数据库中我有:
blabladomain.com
testdomain.com
domain.com
Run Code Online (Sandbox Code Playgroud)
我需要进行一个查询,该查询将返回“domain.com”,因为它是“somedomain.com”的子字符串。
我不知道这在 MySQL 中是否可行。
CREATE TABLE `site_core_antispam_banned_domain` (
`domain_id` int(11) NOT NULL AUTO_INCREMENT,
`domain_name` varchar(255) NOT NULL,
PRIMARY KEY (`domain_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud) 我正在 T-SQL † 中编写自定义 JSON 解析器。
出于解析器的目的,我使用了PATINDEX
从标记列表中计算标记位置的函数。在我的情况下,令牌都是单个字符,它们包括以下内容:
{ } [ ] : ,
通常,当我需要找到几个给定字符中的任何一个的(第一个)位置时,我会使用这样的PATINDEX
函数:
PATINDEX('%[abc]%', SourceString)
Run Code Online (Sandbox Code Playgroud)
然后,该函数将给我a
orb
或 or的第一个位置c
——以最先找到的为准—— in SourceString
。
现在我的问题似乎与]
角色有关。一旦我在字符列表中指定它,例如像这样:
PATINDEX('%[[]{}:,]%', SourceString)
Run Code Online (Sandbox Code Playgroud)
我的预期模式显然被破坏了,因为该函数从未找到匹配项。看起来我需要一种方法来转义第一个,]
以便PATINDEX
将其视为查找字符之一而不是特殊符号。
我发现这个问题询问了一个类似的问题:
但是,在这种情况下,]
不需要在方括号中简单地指定,因为它只是一个字符,并且可以在不使用方括号的情况下指定。使用转义的替代解决方案仅适用于LIKE
而不适用于PATINDEX
,因为它使用一个ESCAPE
子条款,由前者支持而不是由后者支持。
所以,我的问题是,有没有什么办法去寻找一个]
与PATINDEX
使用[ ]
通配符?或者有没有办法使用其他 Transact-SQL 工具模拟该功能?
这是我需要使用PATINDEX
上述[…]
模式的查询示例。这里的模式有效(虽然有点),因为它不包含]
字符。我也需要它来工作] …
sql-server t-sql pattern-matching sql-server-2014 string-searching
我有一个 1 TB 的数字串。给定一个 12 个字符的数字序列,我想获取该序列在原始字符串(charindex
函数)中的起始位置。
我已经使用 SQL Server 使用 1GB 字符串和 9 位子字符串对此进行了测试,并将字符串存储为varchar(max)
. Charindex
需要 10 秒。将 1GB 字符串分解为 900 字节重叠块并创建一个表(StartPositionOfChunk、Chunkofstring),其中包含二进制排序规则的 chunkofstring,索引时间不到 1 秒。10GB,10 位子字符串的后一种方法将 charindex 提高到 1.5 分钟。我想找到一种更快的存储方法。
数字串:0123456789 - 要搜索的子字符串 345
charindex('345','0123456789') 给出 4
方法 1:我现在可以将其存储在包含一列的 SQL Server 表 strtable 中colstr
并执行:
select charindex('345',colstr) from strtable
Run Code Online (Sandbox Code Playgroud)
方法2:或者我可以通过拆分原始字符串来组成一个表strtable2(pos,colstr1):1;012 | 2;123 | 3;234 aso然后我们可以进行查询
select pos from strtable2 where colstr1='345'
Run Code Online (Sandbox Code Playgroud)
方法 3:我可以通过将原始字符串拆分成更大的块来组成一个表strtable2 (pos2,colstr2) …
sql-server physical-design string-splitting sql-server-2017 string-searching
我想匹配WHERE
子句中字符串的开头。虽然我认识到数据库性能通常取决于底层数据结构,但是否有最佳实践来做到这一点?是否有一种选择总是优于其他选择?
我想避免,LIKE
因为我认为它的效率低于LEFT
or CHARINDEX
。据我所知,我的选择如下。欢迎其他建议:
DECLARE @MyField as varchar(10)
SET @MyField = 'HELLOWORLD'
SELECT 1 WHERE @MyField LIKE 'HELLO%'
SELECT 2 WHERE LEFT(@MyField, 5) = 'HELLO'
SELECT 3 WHERE CHARINDEX('HELLO', @MyField) = 1
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 postgresql 为某些图像实现全文搜索。我正在将有关我的图像的一些信息存储到我表中的 json 字段中。这个 json 有一个tags
键,我有多种语言,每种语言都有标签(关键字),如下所示:
"tags": {
"en": ["blue female", "red female"],
"es": ["hembra azul", "hembra roja"]
}
Run Code Online (Sandbox Code Playgroud)
tsvector
考虑到我有更多语言,此时我还不清楚如何存储。
一个最初的想法是将所有这些连接tsvectors
成一个,并将其存储在我表中的一列中。
第二个想法是为每种语言创建一个不同的列,并将对应向量存储到该列中。
哪个会更好?也许还有另一种更好的方法?
我们有一个简单的语法,允许我们查看单个标量的数组,
SELECT 'foo' = ANY(ARRAY['foo', 'bar', 'baz']);
Run Code Online (Sandbox Code Playgroud)
我们可以用同样的方法来匹配 LIKE
SELECT 'foobar' LIKE ANY(ARRAY['foo%', 'bar%', 'baz%'];
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果你想做另一个。
SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%'
ERROR: syntax error at or near "ANY"
LINE 1: SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%';
Run Code Online (Sandbox Code Playgroud)
我知道语法不起作用,但我希望它起作用。
# SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
ERROR: operator does not exist: text[] ~~ unknown
LINE 1: SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
我想过滤一个数组以查看元素是否存在。这可能不使用 …
这里我们有两组数字。问题是我无法弄清楚如何从数字的输入到输出(下面的 DDL 和 DML 以及这里的小提琴)。
current_data
1,2,3
1,4
1,5,7
8,9,10
10,11,15
expected_outcome
1,2,3,4,5,7
8,9,10,11,15
Run Code Online (Sandbox Code Playgroud)
我们只是尝试根据单个数字是否与任何其他组匹配来匹配一组数字。然后合并所有这些组。
例如。
如果我们有:
('1,2,3'),
('1,4'),
('1,5,7')
Run Code Online (Sandbox Code Playgroud)
我们想要:
(1,2,3,4,5,7)
Run Code Online (Sandbox Code Playgroud)
我们将它们合并为 PostgreSQL 中的一行。
或(另一个例子):
('8,9,10'),
('10,11,15')
Run Code Online (Sandbox Code Playgroud)
所需的输出:
(8,9,10,11,15)
Run Code Online (Sandbox Code Playgroud)
查询将对这些数字进行分组,因为它们的共同点是数字 10。但它不会与(1,2,3,4,5,7)
不共享数字的前一行(即)分组。
当我们将这些组放在一张表中时。如果他们在每一组中至少有一个匹配的号码,他们才会分组在一起。
======== DDL 和 DML ============
create table current (current_data text not null);
create table expected_output (expected_outcome text not null);
insert into current (current_data) values ('1,2,3'),('1,4'),('1,5,7'),('8,9,10'), ('10,11,15');
insert into expected_output (expected_outcome) values ('1,2,3,4,5,7'),('8,9,10,11,15');
Run Code Online (Sandbox Code Playgroud) string-searching ×10
postgresql ×4
sql-server ×4
array ×2
string ×2
index ×1
like ×1
mysql ×1
operator ×1
regex ×1
t-sql ×1
terminology ×1