#sql-server #sql-server-2012
#sql-сервер #sql-server-2012
Вопрос:
У меня есть таблица, подобная
-------- -------
| id | name |
-------- -------
| 302345 | Name1 |
| 522345 | Name2 |
| 1X2345 | Name3 |
| 2X2345 | Name4 |
| 1X8765 | Name5 |
| 2X2123 | Name6 |
| 502345 | Name7 |
| M62345 | Name8 |
-------- -------
Я хочу взять идентификатор, у которого нет префикса 30
, 1X
2X
. Таким образом, у меня есть более 20 префиксов, которые нужно исключить. Я использовал NOT LIKE
20 раз и хотел сократить его. Из некоторых вопросов stackoverflow я обнаружил, что мы можем создать таблицу и сохранить все эти значения в столбце и использовать это. Но в моем случае у меня нет разрешения на создание таблицы. Следовательно, попробовал приведенный ниже код, но он дает странные результаты.
SELECT *
FROM mytable
INNER JOIN (
SELECT '30%' Prefix
UNION ALL
SELECT '50%'
UNION ALL
SELECT '1X%'
) list ON id NOT LIKE prefix
ЗДЕСЬ ПОИГРАЙТЕ. Пожалуйста, предложите какую-нибудь альтернативу.
Ожидаемый результат
-------- -------
| id | name |
-------- -------
| 522345 | Name2 |
-------- -------
| 502345 | Name7 |
-------- -------
| M62345 | Name8 |
-------- -------
Ответ №1:
Вы могли бы использовать конструкцию NOT EXISTS
с VALUES
для всех ваших префиксов.
Что-то вроде этого:
SELECT *
FROM mytable mt
WHERE NOT EXISTS (SELECT 1
FROM (VALUES('30%'),('50%'),('1X%'),('2X%')/*,...*/)V(expr)
WHERE mt.id LIKE V.expr);
Комментарии:
1. Учитывая, что они также являются префиксами, @M.Ali запрос по-прежнему будет саргируемым, что всегда является приятным преимуществом. 🙂