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
。
好的,所以我有一个 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
在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)的破折号相匹配。
我有一个查询,它对存储计算机上文件的完整路径位置的列执行类似的语句。
例子
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 标准版
我网站的自动完成搜索功能搜索包含销售商品型号的 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
最近,我尝试通过将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) 我想跨连接表的列进行搜索。以下查询的最佳索引配置是什么?
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)
此刻,我对主键和非聚集索引(不包括任何列)列的聚簇索引AId
,ValueA
和ValueB
。
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 *
. 当然,这可以改变,但会对应用程序产生相当大的影响。
我有一份工作向一组用户发送不相关的电子邮件。
电子邮件的标题是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
我遇到一个问题,我不断从下面的查询中获取值“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。
我们有一张包含约 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) string-searching ×10
sql-server ×9
collation ×2
index-tuning ×1
jobs ×1
like ×1
performance ×1
postgresql ×1
t-sql ×1
utf-8 ×1
xml ×1