LIKE '%[9-15]%'(SQL 服务器)
LIKE '%[9-15]%' (SQL Server)
我正在使用 SQL Server 2017,我想问一下是否可以使用 LIKE
like 运算符,如下所示:
LIKE '%Ticket [8-14]%'
这是正确的还是大于 9 的数字(10,11 等)将被识别为 1 和 0、1 和 1、1 和 2 等
如果这种方式不起作用,我可以select所有包含'Ticket 10'、'Ticket11'等字符串的数据怎么办?
感谢您的宝贵时间
'%Ticket [8-14]%'
括号用于指定单个字符,通常指定为下限和上限范围,如“[0-9]”或“[a-z]”。
您的字符串将匹配:
"Ticket 1" 到 "Ticket 8"。 4 将被忽略,因为它已经由 8-1 范围处理。
它不会匹配 "Ticket 0" 或 "Ticket 9" 或 "Ticket 10"。
据我所知,没有。但是,您可以执行以下操作:
WITH Demo AS
(
SELECT * FROM (VALUES
('Ticket 1'),
('Ticket 7'),
('Ticket 8'),
('Ticket 10'),
('Ticket 12'),
('Ticket 15')
) T(X)
)
SELECT *
FROM Demo
WHERE X LIKE '%Ticket [8-9]%' OR X LIKE '%Ticket 1[0-4]%'
此外,请考虑规范化 - 如果您需要查询此值,请创建 TicketNumber
列。连接 Ticket
和数字比解析字符串要容易得多。如果需要,TicketNumber
也可以轻松编入索引。
解析数字还有更巧妙的思路:
WITH Demo AS
(
SELECT * FROM (VALUES
('Ticket 1'),
('Ticket 7'),
('My Ticket 8A'),
('Ticket 10'),
('Some Ticket 12'),
('Ticket 15 other text'),
('Ticket 135 and more')
) T(X)
)
SELECT *, CAST(CASE WHEN PATINDEX('%Ticket [0-9][0-9][0-9]%',X)!=0 THEN SUBSTRING(X, PATINDEX('%Ticket [0-9][0-9][0-9]%',X)+7, 3)
WHEN PATINDEX('%Ticket [0-9][0-9]%',X)!=0 THEN SUBSTRING(X, PATINDEX('%Ticket [0-9][0-9]%',X)+7, 2)
WHEN PATINDEX('%Ticket [0-9]%',X)!=0 THEN SUBSTRING(X, PATINDEX('%Ticket [0-9]%',X)+7, 1)
END AS int) Number
FROM Demo
列号现在应包含简单的 int 值 - 可以进行比较并参与计算。
与 Pawel 的方法略有不同,但想法非常相似:
SELECT *
FROM YourTable YT
CROSS APPLY(VALUES('8'),('9'),('10'),('11'),('12'),('13'),('14')) V(TN)
WHERE YT.YourColumn LIKE '%Ticket ' + V.TN + '%';
如果您将其用作存储过程,则可以使用 table 值参数来保存数据。类似于:
CREATE TYPE numbers AS table (Number int);
GO
CREATE PROC YourProc @TicketNumbers numbers READONLY AS
SELECT *
FROM YourTable YT
CROSS JOIN @TicketNumbers TN
WHERE YT.YourColumn LIKE 'Ticket ' + CONVERT(varchar(3),TN.Number) + '%';
GO
我正在使用 SQL Server 2017,我想问一下是否可以使用 LIKE
like 运算符,如下所示:
LIKE '%Ticket [8-14]%'
这是正确的还是大于 9 的数字(10,11 等)将被识别为 1 和 0、1 和 1、1 和 2 等
如果这种方式不起作用,我可以select所有包含'Ticket 10'、'Ticket11'等字符串的数据怎么办?
感谢您的宝贵时间
'%Ticket [8-14]%'
括号用于指定单个字符,通常指定为下限和上限范围,如“[0-9]”或“[a-z]”。
您的字符串将匹配:
"Ticket 1" 到 "Ticket 8"。 4 将被忽略,因为它已经由 8-1 范围处理。
它不会匹配 "Ticket 0" 或 "Ticket 9" 或 "Ticket 10"。
据我所知,没有。但是,您可以执行以下操作:
WITH Demo AS
(
SELECT * FROM (VALUES
('Ticket 1'),
('Ticket 7'),
('Ticket 8'),
('Ticket 10'),
('Ticket 12'),
('Ticket 15')
) T(X)
)
SELECT *
FROM Demo
WHERE X LIKE '%Ticket [8-9]%' OR X LIKE '%Ticket 1[0-4]%'
此外,请考虑规范化 - 如果您需要查询此值,请创建 TicketNumber
列。连接 Ticket
和数字比解析字符串要容易得多。如果需要,TicketNumber
也可以轻松编入索引。
解析数字还有更巧妙的思路:
WITH Demo AS
(
SELECT * FROM (VALUES
('Ticket 1'),
('Ticket 7'),
('My Ticket 8A'),
('Ticket 10'),
('Some Ticket 12'),
('Ticket 15 other text'),
('Ticket 135 and more')
) T(X)
)
SELECT *, CAST(CASE WHEN PATINDEX('%Ticket [0-9][0-9][0-9]%',X)!=0 THEN SUBSTRING(X, PATINDEX('%Ticket [0-9][0-9][0-9]%',X)+7, 3)
WHEN PATINDEX('%Ticket [0-9][0-9]%',X)!=0 THEN SUBSTRING(X, PATINDEX('%Ticket [0-9][0-9]%',X)+7, 2)
WHEN PATINDEX('%Ticket [0-9]%',X)!=0 THEN SUBSTRING(X, PATINDEX('%Ticket [0-9]%',X)+7, 1)
END AS int) Number
FROM Demo
列号现在应包含简单的 int 值 - 可以进行比较并参与计算。
与 Pawel 的方法略有不同,但想法非常相似:
SELECT *
FROM YourTable YT
CROSS APPLY(VALUES('8'),('9'),('10'),('11'),('12'),('13'),('14')) V(TN)
WHERE YT.YourColumn LIKE '%Ticket ' + V.TN + '%';
如果您将其用作存储过程,则可以使用 table 值参数来保存数据。类似于:
CREATE TYPE numbers AS table (Number int);
GO
CREATE PROC YourProc @TicketNumbers numbers READONLY AS
SELECT *
FROM YourTable YT
CROSS JOIN @TicketNumbers TN
WHERE YT.YourColumn LIKE 'Ticket ' + CONVERT(varchar(3),TN.Number) + '%';
GO