标签: string-searching

PostgreSQL 中 LIKE、SIMILAR TO 或正则表达式的模式匹配

我必须编写一个简单的查询,在其中查找以 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

123
推荐指数
3
解决办法
18万
查看次数

当您搜索字符串的中间而不是开头时,它叫什么?

我正在努力提高我的词汇量,以便更好地与我的开发人员交流。我们在站点中有几个地方正在讨论是否应该从头开始搜索字符串,还是应该在字符串中的'running%'任何位置搜索'%running%

我一直将中间搜索称为“模糊”,我意识到这是不正确的,因为模糊意味着改变单词“run”、“runing”[原文如此]、“runed”[原文如此]的形式。

搜索字符串开头和搜索字符串中间的正确术语是什么?

terminology regex string-searching

20
推荐指数
1
解决办法
2185
查看次数

如何在另一个字符串中找到一个字符串的所有位置

如何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)

sql-server-2005 sql-server string-searching

11
推荐指数
2
解决办法
5万
查看次数

查找是否有任何行部分匹配字符串

我想查看一个表是否包含给定字符串的任何子字符串。

假设我有一个字符串

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)

mysql string string-searching

9
推荐指数
1
解决办法
6万
查看次数

使用“[ ]”通配符将 ](右方括号)与 PATINDEX 匹配

我正在 T-SQL † 中编写自定义 JSON 解析器。

出于解析器的目的,我使用了PATINDEX从标记列表中计算标记位置的函数。在我的情况下,令牌都是单个字符,它们包括以下内容:

{ } [ ] : ,

通常,当我需要找到几个给定字符中的任何一个的(第一个)位置时,我会使用这样的PATINDEX函数:

PATINDEX('%[abc]%', SourceString)
Run Code Online (Sandbox Code Playgroud)

然后,该函数将给我aorb或 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

9
推荐指数
1
解决办法
4714
查看次数

为charindex函数拆分/存储长字符串的最快方法

我有一个 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

8
推荐指数
2
解决办法
839
查看次数

LEFT 与 CHARINDEX 用于匹配 T-SQL 中字符串的开头

我想匹配WHERE子句中字符串的开头。虽然我认识到数据库性能通常取决于底层数据结构,但是否有最佳实践来做到这一点?是否有一种选择总是优于其他选择?

我想避免,LIKE因为我认为它的效率低于LEFTor 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)

sql-server string-searching

6
推荐指数
1
解决办法
2万
查看次数

使用 postgresql 进行多语言全文搜索

我正在尝试使用 postgresql 为某些图像实现全文搜索。我正在将有关我的图像的一些信息存储到我表中的 json 字段中。这个 json 有一个tags键,我有多种语言,每种语言都有标签(关键字),如下所示:

"tags": {
    "en": ["blue female", "red female"],
    "es": ["hembra azul", "hembra roja"]
}
Run Code Online (Sandbox Code Playgroud)

tsvector考虑到我有更多语言,此时我还不清楚如何存储。

一个最初的想法是将所有这些连接tsvectors成一个,并将其存储在我表中的一列中。

第二个想法是为每种语言创建一个不同的列,并将对应向量存储到该列中。

哪个会更好?也许还有另一种更好的方法?

postgresql full-text-search string-searching

6
推荐指数
1
解决办法
2163
查看次数

错误:运算符不存在:text[] ~~ text

我们有一个简单的语法,允许我们查看单个标量的数组,

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)

我想过滤一个数组以查看元素是否存在。这可能不使用 …

postgresql array operator like string-searching

5
推荐指数
1
解决办法
1万
查看次数

将 .csv 值匹配为 INT。如果 .csv 中某个组中的一个值与另一组中的一个值匹配,则合并字符串

这里我们有两组数字。问题是我无法弄清楚如何从数字的输入到输出(下面的 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)

postgresql array string string-splitting string-searching

5
推荐指数
1
解决办法
94
查看次数