标签: like

为什么搜索 LIKE N'%?%' 匹配任何 Unicode 字符并且 = N'?' 匹配很多?

DECLARE @T TABLE(
  Col NCHAR(1));

INSERT INTO @T
VALUES      (N'A'),
            (N'B'),
            (N'C'),
            (N'?'),
            (N'?'),
            (N'?');
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM   @T
WHERE  Col LIKE N'%?%'
Run Code Online (Sandbox Code Playgroud)

退货

Col
A
B
C
?
?
?
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM   @T
WHERE  Col = N'?' 
Run Code Online (Sandbox Code Playgroud)

退货

Col
?
?
?
Run Code Online (Sandbox Code Playgroud)

使用下面的生成每个可能的双字节“字符”显示=版本匹配其中的 21,229 个和LIKE N'%?%'所有版本(我尝试了一些非二进制排序规则,结果相同)。

WITH T(I, N)
AS 
(
SELECT TOP 65536 ROW_NUMBER() OVER (ORDER BY @@SPID),
                 NCHAR(ROW_NUMBER() OVER (ORDER BY @@SPID))
FROM master..spt_values v1, 
     master..spt_values v2
)
SELECT I, N 
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server like unicode sql-server-2016

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

在 LIKE 运算符中选择多个值

我有下面给出的 SQL 查询,我想使用like运算符选择多个值。

我的查询正确吗?

SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
FROM       employee
INNER JOIN employee_mdata_history 
ON         employee.ident=employee_mdata_history.employee_ident 
WHERE      employee_id like 'emp1%' , 'emp3%' 
ORDER BY   rx_dt desc
Run Code Online (Sandbox Code Playgroud)

如果没有,有人可以纠正我吗?

我的表有大量以'emp1'和开头的数据'emp3'。我可以根据前 3 个“emp1”和前 2 个“emp3”过滤结果rx_dt吗?

sql-server-2008 sql-server operator like

16
推荐指数
2
解决办法
25万
查看次数

如何在区分大小写的数据库中执行不区分大小写的 LIKE?

我的供应商要求数据仓库数据库区分大小写,但我需要对其进行不区分大小写的查询。

在区分大小写的数据库中,您如何将其编写为不区分大小写?

    Where Name like '%hospitalist%'
Run Code Online (Sandbox Code Playgroud)

sql-server collation like

14
推荐指数
3
解决办法
7万
查看次数

克服 LIKE 字符长度限制

通过在此处阅读此LIKE 字符长度限制,看起来我无法在 LIKE 子句中发送超过 ~4000 个字符的文本。

我正在尝试从特定查询的查询计划缓存中获取查询计划。

SELECT *
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?'
Run Code Online (Sandbox Code Playgroud)

如果里面的查询LIKE超过 4000 个字符,那么即使我的查询在缓存计划中,我也会得到 0 个结果。(我期待至少有一个错误)。

有没有办法解决这个问题或采取不同的方式?我有可能是 >10000字符长的查询,看起来我无法通过LIKE.

sql-server t-sql like sql-server-2016

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

匹配用作撇号的左右单引号

我有四列包含名称,并希望LIKE在 Microsoft SQL Server 环境中使用 a 来搜索这些列。

复杂之处在于名称可能包括左右单引号/斜撇号(即,char(145)char(146)),它们应该与直撇号匹配(即', char(39)

执行以下操作非常慢:

SELECT person_id
FROM person
WHERE REPLACE(
          REPLACE(
              person_name, 
              CHAR(145), 
              CHAR(39)
          ), 
          CHAR(146), 
          CHAR(39)
      ) LIKE '{USER_INPUT}'
Run Code Online (Sandbox Code Playgroud)

正如Stack Overflow 上的SQL 替换语句太慢中所解释的那样,这是因为使用REPLACE使语句不可修改。

有没有办法让 SQL Server 以更好的方式处理这种情况?

已经提出的一种解决方案是具有应用程序产生一个“搜索”值,它串接所有字段(的person_nameperson_surnameperson_nickname等)并且将存在问题的字符在编辑点。这可以被有效地索引和搜索。与实施像 Lucene 这样的完整 NoSQL 解决方案相比,将这些数据存储在单独的 SQL 表/列中需要更少的应用程序重写。

上面的例子是一个简化:查询并没有像我上面解释的那样从字面上构建,我们确实实现了 SQL 注入(和其他)保护。

问题是如何将表数据中的斜撇号替换为直撇号。澄清:

  • 用户用品O‘Malley- 这应该匹配两者O‘MalleyO'Malley
  • 用户用品O'Malley- 这应该匹配两者O‘Malley …

sql-server t-sql pattern-matching like

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

Like 谓词只匹配整个单词

我有一个 SQLite 数据库,其中有一个名为minecraft.

+----+----------------------+
| id |         name         |
+----+----------------------+
|  1 | Pocket Mine MP       |
|  2 | Open Computers       |
|  3 | hubot minecraft skin |
|  4 | Terasology           |
|  5 | msm                  |
+----+----------------------+
Run Code Online (Sandbox Code Playgroud)

我需要找到所有在其“名称”字段中包含“e”和“o”的记录。这是我的选择查询:

select * from minecraft where name like '%e%o%'
Run Code Online (Sandbox Code Playgroud)

以下是上述查询的结果:

+----+----------------+
| id |      name      |
+----+----------------+
|  2 | Open Computers |
|  4 | Terasology     |
+----+----------------+
Run Code Online (Sandbox Code Playgroud)

问题是 Like 谓词匹配整个值,而不是单词。不应该匹配 id = 2 的行,因为所有条件都没有出现在一个单词中('e' 出现在第一个单词中,'o' …

sqlite select like

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

计算表中单词的出现速度很慢

考虑这些简化的表:

CREATE TABLE dbo.words
(
    id bigint NOT NULL IDENTITY (1, 1),
    word varchar(32) NOT NULL,
    hits int NULL
)

CREATE TABLE dbo.items
(
    id bigint NOT NULL IDENTITY (1, 1),
    body varchar(256) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

words表包含大约 9000 条记录,每个记录包含一个单词('phone'、'sofa'、'house'、'dog'...) 该items表包含大约 12000 条记录,每条记录的正文不超过 256人物。

现在,我需要更新words表,计算表中有多少记录items保存(至少一次)单词字段中的文本。我需要考虑部分单词,因此所有这 4 条记录都应计入单词dog

CREATE TABLE dbo.words
(
    id bigint NOT NULL IDENTITY (1, 1),
    word varchar(32) NOT NULL,
    hits int NULL
)

CREATE TABLE dbo.items …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql like query-performance

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

Postgresql:与数组元素的模式匹配?

有什么方法可以对 postgresql 中的数组元素进行模式匹配(9.4,如果版本有所不同)?我有一个聚合函数,除其他外,它返回一个元素数组,例如:

SELECT 
   lognum
   ,array_agg(flightnum) as flightnums 
FROM logs 
GROUP BY lognum;
Run Code Online (Sandbox Code Playgroud)

其中flightnum字段是包含文本字符串或三或四位数字的 varchar。现在假设我要选择航班号以“8”开头的所有日志(即“800”或“8000”系列航班)。我的第一个想法是做这样的事情:

SELECT 
   * 
FROM (
      SELECT 
         lognum
         ,array_agg(flightnum) as flightnums 
      FROM logs 
      GROUP BY 
         lognum
     ) s1 
WHERE 
   '8%' like ANY(flightnums);
Run Code Online (Sandbox Code Playgroud)

但是,虽然这不会给出错误,但它也不会返回任何结果。我猜测这是因为通配符位于运算符的左侧。当然,反过来就是:

WHERE ANY(flightnum) like '8%'
Run Code Online (Sandbox Code Playgroud)

给我一个语法错误。那么有什么方法可以运行此查询,以便获得包含以 8(或其他)开头的航班号的任何行吗?


请注意,这是一个简化的示例,仅演示了我遇到困难的部分。

postgresql aggregate array like postgresql-9.4

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

在扩展事件过滤器上使用方括号

我想创建一个扩展事件会话,并使用like_i_sql_unicode_string运算符过滤短语[demo],并使用方括号。我从以下开始:

CREATE EVENT SESSION [demo] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%[demo]%'))
)
ADD TARGET package0.ring_buffer
alter event session [demo] on server state=start
Run Code Online (Sandbox Code Playgroud)

但这会解释[demo]为类似正则表达式的语法上的字符组。所以如果我运行这个:

-- m
Run Code Online (Sandbox Code Playgroud)

它将在扩展事件中捕获。

我得到的最接近的是稍后过滤它,使用[sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%demo%')过滤器然后:

SELECT
n.ev.value('@timestamp','datetimeoffset') as [timestamp],
n.ev.value('data[@name="batch_text"][1]','varchar(max)')  as [batch_text]
FROM sys.dm_xe_session_targets xet
INNER JOIN sys.dm_xe_sessions xe ON xe.[address] = xet.event_session_address
cross apply (select CONVERT(XML, target_data) as xData ) as x
cross apply x.xData.nodes(N'RingBufferTarget/event') AS n(ev)
WHERE xe.name = N'demo' AND xet.target_name = N'ring_buffer'
and n.ev.value('data[@name="batch_text"][1]','varchar(max)') like …
Run Code Online (Sandbox Code Playgroud)

sql-server syntax extended-events operator like

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

SQL Server LIKE 查询的基数估计

我在名为 AspNetUsers 的表的 LastName 列上创建了非聚集索引的统计直方图向量。

在此输入图像描述

如果我运行查询,因为SELECT * FROM dbo.AspNetUsers WHERE LastName = 'Baker'它返回 6 行作为估计行,因为Baker是步骤之一的RANGE_HI_KEY ,因此 EQ_ROWS 值是我的估计行数。同样,如果我运行查询SELECT * FROM dbo.AspNetUsers WHERE LastName = 'Bacilia',它会返回 1 行作为估计行,导致Bacilia落入“Baker”步长范围,因此该步长的AVG_RAGE_ROWS值是我的估计行数。

同样,根据我的理解,如果我执行查询,因为SELECT * FROM dbo.AspNetUsers WHERE LastName LIKE 'Ba%'它匹配 2 个步骤(BakerBatagoda),所以它应该返回 27 + 51 (RANGE_ROWS) + 6 + 4 (EQ_ROWS) = 88。但它返回 99 行作为估计。

此基数估计如何与 LIKE 查询一起使用?在执行 LIKE 查询时,它是否使用不同的公式来估计行数?

sql-server like cardinality-estimates sql-server-2017

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