Чи слід використовувати! = Або <> для не рівних у T-SQL?


800

Я бачив, SQLщо використовує і те, !=і не<> для рівних . Що є кращим синтаксисом і чому?

Мені подобається !=, тому що <>мені це нагадує Visual Basic.


5
Дивіться також: stackoverflow.com/questions/7884/…
Діна,

Переносимість коду. Якщо ANSI SQL легко задовольняє ваші вимоги, то краще використовувати його. Ви можете використовувати один і той же код у всіх БД. Напр. Автор книги SQL, який хоче проілюструвати базовий SQL за допомогою зразкового коду.
Пар

1
Я хотів би додати приклад, коли наявність лише коду ANSI SQL може бути проблемою - Стандартний SQL підтримує параметри NULLS FIRST та NULLS LAST для управління тим, як сортувати NULL, але T-SQL не підтримує цю опцію.
Steam

Немає потреби у повторному відкритті. Зазначене питання є дублікатом, просто продовжений ще ще один варіант, NOT (A = B).
TLama

@Steam, вам слід вказати версію ansi sql, для якої саме року ви бажаєте. Деякі з цих версій навіть вимагають уточнити рівень сумісності або точні частини стандарту. Хто з них ввів NULLS ПЕРШИЙ та NULLS LAST?
Герман

Відповіді:


539

Технічно вони працюють однаково, якщо ви використовуєте AKA T-SQL сервера SQL Server. Якщо ви використовуєте його в збережених процедурах, немає жодної причини для використання однієї іншої. Потім це зводиться до особистих переваг. Я вважаю за краще використовувати <>, оскільки це відповідає стандарту ANSI.

Ви можете знайти посилання на різні стандарти ANSI на ...

http://en.wikipedia.org/wiki/SQL


41
Я завжди вважав за краще використовувати !=його через кожну мову, на яку впливає С, і тому, що в документації Python сказано: "Форми <>і !=еквівалентні; для узгодженості з C !=переважніше; де !=згадується нижче <>, також прийнято. <>написання вважається застарілим «. Але SQL не Python!
Ієн Самуель Маклін Старший

24
Мені подобається використовувати <>, тому що це нагадує мені XML. Але SQL - це не XML!
Роб Грант

32
Так; Microsoft сам рекомендую використовувати <>більш !=конкретно для ANSI відповідності, наприклад , в Microsoft Press комплекту для навчання 70-461 іспиту, «Microsoft SQL Запитів сервер», вони кажуть « В якості прикладу , коли вибрати стандартну форму, T-SQL підтримує два« Не дорівнює "операторам: <> і! =. Перший є стандартним, а другий - ні. Цей випадок повинен бути нобілером: перейдіть на стандартний!"
Метт Гібсон

10
Мені подобається <> тому, що це простіше набрати.
користувач2023861

731

Більшість баз даних підтримують !=(популярні мови програмування) та <>(ANSI).

Бази даних, що підтримують !=і <>:

  • MySQL 5.1: !=і<>
  • PostgreSQL 8.3: !=і<>
  • SQLite: !=і<>
  • Oracle 10г: !=і<>
  • Microsoft SQL Server 2000/2005/2008/2012/2016: !=і<>
  • Динамічний сервер IBM Informix 10: !=і<>
  • InterBase / Firebird: !=і<>
  • Дербі Apache 10.6: !=і<>
  • Sybase Adaptive Server Enterprise 11.0: !=і<>

Бази даних, що підтримують оператор стандарту ANSI, винятково :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>

Django ORM запитує карти на NOT (a = b)замість (a <> b)або (a != b). Це все так само внутрішньо?
користувач

7
@buffer, вони логічно однакові, тобто вони б відповідали або виключали однаковий набір рядків. Але від того, чи оптимізує його конкретний бренд RDBMS, залежить від реалізації. Однак я був би здивований, якби були різниці між брендами бази даних.
Білл Карвін

бічна примітка: LINQ в C # ви повинні використовувати! =
Том Стікель

! = підтримується IBM DB2 LUW 10.5+
Cristi S.

10
@TomStickel LINQ в C # не є SQL.
Крейг

109

'<>'є стандартом SQL-92 і '!='є власником оператора T-SQL. Він також доступний і в інших базах даних, але оскільки це не є стандартним, вам потрібно приймати його в кожному конкретному випадку.

У більшості випадків ви знаєте, до якої бази даних ви підключаєтесь, так що це насправді не проблема. У гіршому випадку, можливо, доведеться здійснити пошук і заміну у своєму SQL.


Я бачу, що mysql sql також використовує його
Bob The Janitor,

3
Чи можемо ми продовжувати називати таке поширене поширення на стандартну мову власником ? На даний момент, здається, стандарт повинен бути оновлений, щоб вимагати або хоча б дозволити обидва синтаксису.
Йохан Буле

3
@JohanBoule добре, є письмовий стандарт для SQL, і наскільки мені відомо, !=це не є його частиною. Хоча для всіх практичних цілей це стандарт дефакто, ми не повинні плутати те, що є, а що не є стандартними функціями.
Адам Лассек



24

Це специфічно для SQL Server. Звичайно, він запитує про SQL Server, але чи можете ви знайти ANSI-специфікацію, щоб побачити, чи гарантовано він портативний для тих із нас, хто любить знати подібне?
Джоел Куехорн

6
@Joel Coehoorn, якщо ви дуже портуєте свої T-SQL-коди, "<>" і "! =" Будуть найменшими вашими турботами !!
КМ.

1
Перенос не проблема - це коли вам, як розробнику, потрібно повертатися вперед і назад між середовищами. Консистенція хороша.
Марк Викуп

20

Схоже, що самі Microsoft вважають <>за краще, !=як свідчать обмеження в таблиці. Я особисто вважаю за краще використовувати, !=тому що я чітко читаю, що як "не рівне", але якщо ви введете [field1 != field2]і збережете це як обмеження, наступного разу, коли ви запитаєте його, воно з’явиться як [field1 <> field2]. Це говорить мені, що це правильно <>.


15

!=, не дивлячись на те, що він не є ANSI, більше відповідає справжньому духу SQL як читається мовою. Це кричить не рівно. <>каже, що це для мене (менше, ніж більше), що просто дивно. Я знаю, що намір полягає в тому, що це або менше, або більше, ніж, отже, не рівне, але це дійсно складний спосіб сказати щось по-справжньому просто.

Мені просто доводилося брати довгі запити SQL і любовно розміщувати їх у XML-файлі через цілу купу дурних причин, в які я не буду вступати.

Досить сказати, що XML зовсім не піддається, <>і мені довелося змінити їх !=і перевірити себе, перш ніж я скрутився.


6
чому б не просто CDATA це? що відбувається, коли ваш запит містить XML?
Янус Троельсен

12

У T-SQL можна використовувати те, що вам подобається. У документації сказано, що вони обидва функціонують однаково. Я вважаю за краще !=, тому що він читає "не рівний" моєму розуму (C / C ++ / C #), але, схоже, віддають перевагу гуру бази даних <>.


10

Я розумію, що синтаксис C !=знаходиться в SQL Server завдяки спадщині Unix (ще в дні Sybase SQL Server, до Microsoft SQL Server 6.5).


7

Однією з альтернатив було б використання оператора NULLIF, відмінного від <>або !=який повертає NULL, якщо два аргументи рівні в NOCLIF в Документах Microsoft . Тому я вважаю , Інеко може бути змінено для <>і !=виглядає наступним чином :

NULLIF(arg1, arg2) IS NOT NULL

Як я з’ясував, у деяких випадках використання <>та !=не працює на дату. Отже, використання наведеного виразу робить необхідним.


6
Я не впевнений, чи виконувала б ця функція так само добре, як <>стосовно використання індексу у всіх кутових випадках. Крім того, читабельність, безумовно, набагато гірша ...
Лукаш Едер

Як я вже згадував у відповіді, це спрацювало для мене на полях дат там у 2014 році. Не впевнений, яке положення / умова було тим, що обмежувало інші відповіді, але дивлячись на деякі оновлення, це, здається, допомагає і іншим.
jitendrapurohit

1

Я вважав за краще використовувати !=замість того, <>що іноді використовую <s></s>синтаксис для запису команд SQL. Використання !=зручніше, щоб уникнути помилок синтаксису в цьому випадку.


-6

Обидва вони прийняті в T-SQL. Однак, здається, що використання <>працює набагато швидше, ніж!= . Я просто запустив складний запит, який використовував !=, і в середньому на це знадобилося близько 16 секунд. Я змінив їх на <>і запит зараз триває приблизно 4 секунди. Це величезне поліпшення!


20
Якщо ви запускаєте два подібних запити один за іншим у SQL Server, він, ймовірно, буде кешувати дані в пам'яті та оптимізований для подібних запитів. Якщо ви зробили це у зворотному порядку, ви можете виявити протилежний результат!
codemonkey

2
Це також неправильно, у них не було б двох операторів, які функціонували б точно так само, і один був повільнішим "просто" причиною ". Існує багато факторів, що сприяють тому, чому один і той же запит створює різні терміни виконання.
Шанс Елліот

-11

Хоча вони функціонують однаково, !=означає точно "не дорівнює", тоді як <>означає більше і менше значення, що зберігається.

Розгляну >=або <=, і це буде мати сенс , коли факторинг в індексах на запити ... <>буде працювати швидше , а в деяких випадках (з правом індексу), але і в деяких інших випадках (індекс безкоштовно) вони будуть працювати так само.

Це також залежить від того, як ваша система баз даних зчитує значення !=та <>. Постачальник баз даних може просто клацнути його і змусити їх функціонувати однаково, так що жодної користі не має. ПрограмаgregSQL і SQL Server не скорочують цього; воно читається так, як показано вище.


3
Чи є у вас якісь підтвердження щодо вашої заяви? Обидва оператори, схоже, абсолютно однакові в PostgreSQL , Oracle та MySQL .
GhostGambler

8
Це абсолютно неправильно, може здатися, що ви "більше і менше, ніж значення, що зберігається", коли ви комбінуєте ці символи у своєму розумі, але для лексема це лише інший спосіб представити маркер.
Шанс Елліот

Відсутність відповідного ресурсу!
mostafa8026
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.