У меня есть строка в столбце в таблице SQL Server:

30,36,40,41,42,52,62,63,66,67,76

Как видите, эта строка имеет номер 62 и номер 66.

Я использую это регулярное выражение для соответствия этой строке:

%62%76%

Но это не соответствует этой строке.

Как мне нужно изменить это регулярное выражение в соответствии с указанной строкой?

Часть кода SQL:

WHERE 
    (SELECT STUFF((SELECT ',' + CONVERT(NVARCHAR(MAX), TagID)
                   FROM ItemTag
                   WHERE ItemID = nt.ItemID
                   FOR XML PATH('')), 1, 1, '') AS tags) LIKE '%62%76%'

Очень странно, но когда я использую %30%52%, он соответствует строке, но когда я использую %30%62%, совпадения нет.

0
Remzes 18 Авг 2019 в 03:56

2 ответа

Лучший ответ

Вам необходимо указать ORDER BY TagID, чтобы гарантировать, что значения TagID упорядочены так, как необходимо для выражения LIKE:

WHERE (SELECT STUFF(
  (
    SELECT ',' + CONVERT(NVARCHAR(MAX), TagID)
    FROM ItemTag
    WHERE ItemID = nt.ItemID
    ORDER BY TagID
    FOR XML PATH('')
  ), 1, 1, '') as tags
) LIKE '%62%76%'
2
Dan Guzman 18 Авг 2019 в 01:22

Это выглядит как безумный способ попытаться увидеть, есть ли два значения в наборе. Вместо:

where exists (select 1
              from ItemTags it
              where it.ItemId = nt.ItemId and
                    it.tagid = 62
             ) and
      exists (select 1
              from ItemTags it
              where it.ItemId = nt.ItemId and
                    it.tagid = 76
             );

Зачем мне использовать прилагательное типа «сумасшедший» (что я не имею в виду в буквальном, клиническом смысле)?

  • Для такого сравнения не нужно преобразовывать целое число в строку.
  • Для такого сравнения нет необходимости использовать такие функции, как XML.
  • EXISTS должен быть достаточно эффективным, особенно с индексом ItemTags(itemId, tagId).
  • LIKE просто не следует использовать для целочисленных сравнений.
1
Gordon Linoff 18 Авг 2019 в 05:43