标签: string-searching

postgresql 匹配或转换 utf-8 变体字符串

Postgres 13

我正在寻找一种在 postgresql 中搜索可能具有变体字符表示形式的 UTF-8 文本的方法(正确的术语是什么?即vs )。life

我遇到匹配变体字符的问题,请考虑

-- This works as expected
select 'life' ilike '%life%' matches 

-- I would like to also be able to match against this source text like this
select '' ilike '%life%' matches
Run Code Online (Sandbox Code Playgroud)

请注意,有无数的变体,我此时并不特别关心与非 ascii 可表示字符的匹配,也就是说,我认为只要最终与 匹配,我就可以从 utf-8 到 ascii 有损转换life

postgresql collation utf-8 string-searching postgresql-13

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

查找具有额外字符的相同字符串的记录

好的,所以我有一个 Microsoft SQL Server 2014 数据库表,owner其中包含大约 90,000 条包含所有者信息的记录,另一个vehicle包含车辆信息

Owner_Name                   owner_id       V_name     owner_id    exempt
-------------------------------------       ------------------------------
JACOB JAMISON & JESSICA           35        Civic            35        H3
JACOB JAMISON M & JESSICA B       39        Accord           39        H3 
BLACKSON BARRINGTON               56        Bugatti          56        H6
BLACKSON BARRINGTON H             98        SSC              98        H7
BRUSTER MICHAEL                   107       Corvette         107       H9
Run Code Online (Sandbox Code Playgroud)

我正在尝试查找对车辆具有多个豁免的所有记录(H0意味着没有豁免)。下面的代码运行良好,只要名称完全相同。但是,如果有变化,例如额外的字母或向后输入,则不会返回这些记录。我看过类似的东西SOUNDEX,但这在我的场景中不起作用。

SELECT Owner_name
     , COUNT(Owner_name) AS 'xNameAppears'
     , COUNT(v.exempt) AS 'ExemptionCount' 
FROM owner o
INNER JOIN vehicle V …
Run Code Online (Sandbox Code Playgroud)

sql-server full-text-search sql-server-2014 string-searching

4
推荐指数
1
解决办法
220
查看次数

如何确定列中是否存在连字符 (-)

CASE表达式中,我试图在文本列中搜索以识别连字符 (-):

CASE 
     WHEN SUBSTRING(al.ALT_ADDRESS,1,1) IN('1','5','7') 
      AND al.NEW_ADDRESS CONTAINS '-' 
     THEN CONCAT(al.ALT_ADDRESS,al.NEW_ADDRESS)
Run Code Online (Sandbox Code Playgroud)

连字符可以位于列中的任何位置,因此我只需要知道它是否存在,而不管它在列中的实际位置。

我目前正在使用与@Josh 提供的完全相同的代码( LIKE '%-%'),但它不起作用,因为它没有为我知道它“应该”的几个特定实例返回正确的数据。确切的文字ALT_ADDRESS是:“2754 Churchill Circle”。确切的文字NEW_ADDRESS是:“O-89421”。但是,返回的结果不包括NEW_ADDRESS(O-89421)。

我已经确认破折号NEW_ADDRESS确实与我使用搜索(ASCII 45)的破折号相匹配。

sql-server sql-server-2016 string-searching

4
推荐指数
2
解决办法
6771
查看次数

有什么方法可以提高搜索值左侧有 % 的类似搜索的性能吗?

我有一个查询,它对存储计算机上文件的完整路径位置的列执行类似的语句。

例子

select * 
from table 
where fullpath like '%hi.exe'
Run Code Online (Sandbox Code Playgroud)

这似乎从未使用索引,并且与执行 fullpath = 'value' 相比非常慢(显然)

但我的问题是,有没有什么方法或想法可以加快查询结果或让它使用索引?

如果右侧有类似的内容,我不会看到同样的缓慢(例如 select * from table where fullpath like 'hi%'

编辑:Microsoft Sql server 2017 标准版

sql-server string-searching query-performance

4
推荐指数
2
解决办法
392
查看次数

自动完成太慢:可能的优化吗?

我网站的自动完成搜索功能搜索包含销售商品型号的 varchar 字段。

该字段可以包含 1 到 75 个字符的字符串,并且该表包含 400 000 行。我提出了一个仅从字符串开头搜索的查询,执行时间大约为 150-250 毫秒,这是可以接受的,但现在我的经理希望查询搜索任何子字符串,这会使查询速度慢 3-10 倍(大约 1000-2000 毫秒)。

我构建了一个 JS 小提琴,为您提供数据的示例以及两个查询的示例。

http://sqlfiddle.com/#!6/9efa3/2/0

表上已经有一些索引了。加速这个自动完成搜索字段的最佳实践是什么?(数据库版本为SQLSERVER 2008R2)

这是我正在处理的数据的一个简短示例:

CREATE TABLE [Products](
    [productid] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [model] [nvarchar](75) NOT NULL 
 CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED 
(
    [productid] ASC
));

insert into products values ('UMPX1AA0011 danish e-315 woot');
insert into products values ('P27y719VC');
insert into products values ('VG2y439m-LED');
insert into products values ('UMUyX165AAB01');
insert into products values ('U28y79VF');
insert into products values …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2008-r2 string-searching query-performance

3
推荐指数
1
解决办法
3292
查看次数

T-SQL LIKE 谓词无法与 XML 转换的 varchar 中的空格匹配

最近,我尝试通过将XML数据转换为特定模式来搜索特定模式,varchar(max)尽管我知道这不是最佳实践,并且发现它没有按预期工作:-

设置

declare @container table(
    [Response] xml not null
);

declare @xml xml =
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://abc.com/xsd" xmlns:ns="http://abc.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
     <ns:MessageHeader>
       <xsd:ID>ABC</xsd:ID>
       <xsd:Date>2018-12-31T23:59:59</xsd:Date>
     </ns:MessageHeader>
   </soapenv:Header>
   <soapenv:Body>
     <ns:MessageResponse>
       <ns:return>
         <xsd:ResponseList xsi:nil="true" />
       </ns:return>
     </ns:MessageResponse>
   </soapenv:Body>
 </soapenv:Envelope>';

insert into @container values (@xml);
Run Code Online (Sandbox Code Playgroud)

此查询有效

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true"%';
Run Code Online (Sandbox Code Playgroud)

注意通配符在 XML 节点之前的3 个字符(即结束' />'

但这不是

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true" %' -- …
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql like string-searching

3
推荐指数
1
解决办法
288
查看次数

索引引用的表列

我想跨连接表的列进行搜索。以下查询的最佳索引配置是什么?

Table A
------------
Id
ValueA
-- Table A has many more columns

Table B
------------
Id
AId
ValueB
-- Table B has many more columns
Run Code Online (Sandbox Code Playgroud)

此刻,我对主键和非聚集索引(不包括任何列)列的聚簇索引AIdValueAValueB

SELECT *
FROM TableA a
INNER JOIN TableB b ON a.Id = b.AId
WHERE 
    a.ValueA LIKE 'SearchTerm%' OR
    b.ValueB LIKE 'SearchTerm%'
Run Code Online (Sandbox Code Playgroud)

更新 表 A 可能会遇到数百万个,而表 B 将只有数万个条目。

在现实世界中,表 A 将是一个交易列表,其中的值是某种交易引用。表 B 将是一个用户列表,其中的值可以是任何名称或任何其他描述性信息。

目前我们使用的是一个 ORM,它本质上会做一个SELECT *. 当然,这可以改变,但会对应用程序产生相当大的影响。

sql-server index-tuning string-searching

3
推荐指数
1
解决办法
115
查看次数

如何找到发送特定电子邮件的工作?

我有一份工作向一组用户发送不相关的电子邮件。

电子邮件的标题是Staging -> [AUPAIR] arrivalDate trigger issue

当我使用上面的标题查询 msdb 数据库中的作业表时,我没有得到答案:

USE [msdb]
GO
SELECT    j.job_id,
    s.srvname,
    j.name,
    js.step_id,
    js.command,
    j.enabled
FROM    dbo.sysjobs j
JOIN    dbo.sysjobsteps js
    ON    js.job_id = j.job_id
JOIN    master.dbo.sysservers s
    ON    s.srvid = j.originating_server_id
WHERE    js.command LIKE N'%Staging -> [AUPAIR] arrivalDate trigger issue%'
Run Code Online (Sandbox Code Playgroud)

只有当我改变我的查询如下时,我才能找到强盗工作:

USE [msdb]
GO
SELECT    j.job_id,
    s.srvname,
    j.name,
    js.step_id,
    js.command,
    j.enabled
FROM    dbo.sysjobs j
JOIN    dbo.sysjobsteps js
    ON    js.job_id = j.job_id
JOIN    master.dbo.sysservers s
    ON    s.srvid = j.originating_server_id
--WHERE    js.command LIKE N'Staging …
Run Code Online (Sandbox Code Playgroud)

sql-server database-mail jobs sql-server-2016 string-searching

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

区分大小写不起作用

我遇到一个问题,我不断从下面的查询中获取值“CtP_PETER_Fact”。它应该是区分大小写的 where 子句。我尝试了几种不同的方法:在选择中的“Where ObjectName”之后、正则表达式之后设置 COLLATE 语句,并使用排序规则创建列。我不断得到我意想不到的输出。也许是我的正则表达式有问题?我也对正则表达式进行了很多实验,但似乎无法让它发挥作用。

IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;


CREATE TABLE #nameFacts (


    objectname varchar(200) COLLATE SQL_Latin1_General_CP1_CS_AS,
    ObjectType varchar(40)

)


insert into #nameFacts (objectname, ObjectType)
values
 ('BPD_Inslap_Fact','Fact')
,('CTP_HENK_FACT','Fact')
,('CTP_PETER_Fact','Fact')
,('CTP_PETER_FACT','Fact')
,('CtP_PETER_Fact','Fact')
,('C0P_PETER_Fact','Fact')
,('C0P_PETER_FACT','FACT')


SELECT *
FROM #nameFacts
WHERE
ObjectName --COLLATE SQL_Latin1_General_CP1_CS_AS 
            LIKE '[A-Z0-9][A-Z][A-Z][_][A-Z][A-Z][A-Z][A-Z][A-Z][_][F][a][c][t]' --COLLATE SQL_Latin1_General_CP1_CS_AS


IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;
Run Code Online (Sandbox Code Playgroud)

我不断收到下面的输出,我不希望得到值“CtP_PETER_Fact”。我使用的是 SQL Server 2016 SP2 CU 17。

输出

sql-server collation sql-server-2016 string-searching

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

删除特殊字符的搜索字符串数据

我们有一张包含约 600 万种产品的表:

ID 姓名 代码
1 123.456.789-M
2 852.789456
3 1-123654.P

按代码列过滤产品而没有掩码(痕迹、斜线或点)的好方法(关于性能)是什么?

例子:

SELECT id, name FROM products WHERE code = '123456789M' OR code = '1123654P';
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016 string-searching

-1
推荐指数
1
解决办法
34
查看次数