LIKE "% [9-15]%" (SQL Server) - PullRequest
       14

LIKE "% [9-15]%" (SQL Server)

0 голосов
/ 07 сентября 2018

Я использую SQL Server 2017, и я хотел бы спросить, можно ли использовать оператор LIKE like следующим образом:

LIKE '%Ticket [8-14]%'

Это правильно или числа больше 9 (10,11 и т. Д.) Будут обозначаться как 1 и 0, 1 и 1, 1 и 2 и т. Д. И т. Д.

Если этот способ не работает, что я могу сделать, чтобы выбрать все данные, содержащие строки, такие как «Билет 10», «Билет11» и т. Д ..?

Спасибо, что уделили время

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Насколько я знаю, нет. Тем не менее, вы можете сделать что-то вроде:

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 - готовый для сравнения и участия в вычислениях.

0 голосов
/ 07 сентября 2018

Немного другой подход к Павлу, но очень похожая идея:

SELECT *
FROM YourTable YT
     CROSS APPLY(VALUES('8'),('9'),('10'),('11'),('12'),('13'),('14')) V(TN)
WHERE YT.YourColumn LIKE '%Ticket ' + V.TN + '%';

Если вы используете это как хранимую процедуру, вы можете использовать параметр табличного значения для хранения данных. Что-то вроде:

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
0 голосов
/ 07 сентября 2018

'% Ticket [8-14]%'

Скобки используются для указания одного символа, который обычно указывается в нижнем и верхнем диапазонах, таких как «[0-9]» или «[a-z]».

Ваша строка будет соответствовать:

«Билет 1» через «Билет 8». 4 будет игнорироваться, потому что он уже обработан диапазоном 8-1.

Это не будет соответствовать "Билету 0", "Билету 9" или "Билету 10".

...