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 查询,我想使用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
吗?
我的供应商要求数据仓库数据库区分大小写,但我需要对其进行不区分大小写的查询。
在区分大小写的数据库中,您如何将其编写为不区分大小写?
Where Name like '%hospitalist%'
Run Code Online (Sandbox Code Playgroud) 通过在此处阅读此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
.
我有四列包含名称,并希望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_name
,person_surname
,person_nickname
等)并且将存在问题的字符在编辑点。这可以被有效地索引和搜索。与实施像 Lucene 这样的完整 NoSQL 解决方案相比,将这些数据存储在单独的 SQL 表/列中需要更少的应用程序重写。
上面的例子是一个简化:查询并没有像我上面解释的那样从字面上构建,我们确实实现了 SQL 注入(和其他)保护。
问题是如何将表数据中的斜撇号替换为直撇号。澄清:
O‘Malley
- 这应该匹配两者O‘Malley
或O'Malley
O'Malley
- 这应该匹配两者O‘Malley …
我有一个 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' …
考虑这些简化的表:
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) 有什么方法可以对 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(或其他)开头的航班号的任何行吗?
请注意,这是一个简化的示例,仅演示了我遇到困难的部分。
我想创建一个扩展事件会话,并使用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) 我在名为 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 个步骤(Baker和Batagoda),所以它应该返回 27 + 51 (RANGE_ROWS) + 6 + 4 (EQ_ROWS) = 88。但它返回 99 行作为估计。
此基数估计如何与 LIKE 查询一起使用?在执行 LIKE 查询时,它是否使用不同的公式来估计行数?
like ×10
sql-server ×8
t-sql ×3
operator ×2
aggregate ×1
array ×1
collation ×1
performance ×1
postgresql ×1
select ×1
sqlite ×1
syntax ×1
unicode ×1