Sql server 比如';%[9-15]';(SQL Server)

Sql server 比如';%[9-15]';(SQL Server),sql-server,database,sql-like,Sql Server,Database,Sql Like,我正在使用SQL Server 2017,我想问一下是否可以使用likelike操作符,如下所示: LIKE '%Ticket [8-14]%' 这是否正确,或者大于9的数字(10、11等)将被标识为1和0、1和1、1和2等 如果这种方法不起作用,我该怎么做才能选择所有包含字符串的数据,如“Ticket 10”、“Ticket11”等 谢谢你抽出时间 “%Ticket[8-14]%” 括号用于指定单个字符,通常指定为下限和上限,如“[0-9]”或“[a-z]” 您的字符串将匹配: “票1”到“

我正在使用SQL Server 2017,我想问一下是否可以使用
like
like操作符,如下所示:

LIKE '%Ticket [8-14]%'
这是否正确,或者大于9的数字(10、11等)将被标识为1和0、1和1、1和2等

如果这种方法不起作用,我该怎么做才能选择所有包含字符串的数据,如“Ticket 10”、“Ticket11”等

谢谢你抽出时间

“%Ticket[8-14]%”

括号用于指定单个字符,通常指定为下限和上限,如“[0-9]”或“[a-z]”

您的字符串将匹配:

“票1”到“票8”。4将被忽略,因为它已经由8-1范围处理

它与“票证0”或“票证9”或“票证10”不匹配

“%Ticket[8-14]%”

括号用于指定单个字符,通常指定为下限和上限,如“[0-9]”或“[a-z]”

您的字符串将匹配:

“票1”到“票8”。4将被忽略,因为它已经由8-1范围处理


它与“票证0”或“票证9”或“票证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]%'
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

也要考虑规范化——如果需要查询这个值,请创建<代码> TigKeNo.< /代码>列。连接

票证
和数字要比解析字符串容易得多<如果需要,代码>票号编号也可以轻松编入索引

还有一个更聪明的方法来解析数字:

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值-可以进行比较并参与计算。

据我所知,没有。但是,您可以执行以下操作:

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]%'
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

也要考虑规范化——如果需要查询这个值,请创建<代码> TigKeNo.< /代码>列。连接

票证
和数字要比解析字符串容易得多<如果需要,代码>票号编号也可以轻松编入索引

还有一个更聪明的方法来解析数字:

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 + '%';
如果将其用作存储过程,则可以使用表值参数来保存数据。比如:

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]%'
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

与Pawel的方法略有不同,但想法非常相似:

SELECT *
FROM YourTable YT
     CROSS APPLY(VALUES('8'),('9'),('10'),('11'),('12'),('13'),('14')) V(TN)
WHERE YT.YourColumn LIKE '%Ticket ' + V.TN + '%';
如果将其用作存储过程,则可以使用表值参数来保存数据。比如:

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]%'
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

你是在寻找8…14还是数字会改变?你能提供样本数据和预期结果吗?在排序时,编号在
varchar
中的处理方式不同。例如,语句
'12'<'9'
是真的。@Salman A,在我的例子中是8-14@Larnu,是的,我在找8、9、10、11、12、13和14号票。这可能会有帮助:你是在找8…14号票,还是数字会变?你能提供样本数据和预期结果吗?在排序时,编号在
varchar
中的处理方式不同。例如,语句
'12'<'9'
是真的。@Salman A,在我的例子中是8-14@Larnu,是的,我正在寻找8、9、10、11、12、13和14张票。这可能会有帮助:这实际上是一个非常聪明的主意,我会试试。这实际上是一个非常聪明的主意,我会试试。我试过了你的第一个查询,效果非常好。非常感谢你!我试过你的第一个问题,结果很好。非常感谢你!