У меня есть строка в столбце в таблице 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%
, совпадения нет.
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%'
Это выглядит как безумный способ попытаться увидеть, есть ли два значения в наборе. Вместо:
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
просто не следует использовать для целочисленных сравнений.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.