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