Несколько НЕ ТАК, как в sql Server

#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 запрос по-прежнему будет саргируемым, что всегда является приятным преимуществом. 🙂