Как в SQL получить первые (или последние) строки запроса? TOP или OFFSET? Или в sql


SQL And & Or

AND & OR операторы, которые используются для составления условий в запросах.

Описание операторов AND & OR

AND - оператор, отображающий записи, если первое и второе условие является правдой / true.

OR - оператор, отображающий записи, если хотя бы одно из двух условий является правдой / true.

Пример оператора AND

Есть таблица "Persons":

P_IdLastNameFirstNameAddressCity
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

Итак, мы хотим выбрать только ту запись где "FirstName" равно "Tove" AND(и) "LastName" равно "Svendson":

Для этого используем такой запрос:

Результат запроса:

P_IdLastNameFirstNameAddressCity
2 Svendson Tove Borgvn 23 Sandnes

Пример оператора OR

Итак, мы хотим выбрать только ту запись где "FirstName" равно "Tove" OR(или) "FirstName"равно "Ola":

Для этого используем такой запрос:

Результат запроса:

P_IdLastNameFirstNameAddressCity
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes

Комбинирование AND & OR

Вы также можете комбинировать AND и OR (используя скобки для сложных выражений).

Итак, мы хотим выбрать только ту запись где "LastName" равно "Svendson" AND "FirstName" равно "Tove" OR "Ola":

Для этого используем такой запрос:

Результат запроса:

P_IdLastNameFirstNameAddressCity
2 Svendson Tove Borgvn 23 Sandnes

dimonchik.com

Как используются и для чего нужны в SQL операторы and и or: примеры работы с условиями

От автора: SQL операторы AND и OR используются для более узкого поиска данных через инструкцию SQL. Эти два оператора называются связующими операторами.

Они предоставляют средства для выполнения нескольких сравнений с помощью разных операторов в одной и той же инструкции SQL.

Оператор AND

Оператор AND допускает существование множества условий в условии WHERE инструкции SQL.

Синтаксис

Основной синтаксис оператора AND с условием WHERE выглядит следующим образом:

Бесплатный курс по PHP программированию

Освойте курс и создайте динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

SELECT cтолбец1, cтолбец2, cтолбецN FROM имя_таблицы WHERE [условие1] AND [условие2]...AND [условиеN];

SELECT cтолбец1, cтолбец2, cтолбецN

FROM имя_таблицы

WHERE [условие1] AND [условие2]...AND [условиеN];

С помощью оператора AND вы можете комбинировать N-ное количество условий. Для действия, которое должен выполнить оператор SQL, будь то транзакция или запрос, все условия, разделенные AND, должны выполняться.

Пример

Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:

Приведенный ниже код отображает поля ID, Name и Salary из таблицы CUSTOMERS, для которых зарплата превышает 2000, а возраст составляет менее 25 лет:

SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000 AND age < 25;

SELECT ID, NAME, SALARY

FROM CUSTOMERS

WHERE SALARY > 2000 AND age < 25;

Этот код дает следующий результат -

Бесплатный курс по PHP программированию

Освойте курс и создайте динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Оператор OR

Оператор OR используется для объединения нескольких условий в условии WHERE инструкции SQL.

Синтаксис

Основной синтаксис оператора OR с условием WHERE выглядит следующим образом:

SELECT cтолбец1, cтолбец2, cтолбецN FROM имя_таблицы WHERE [условие1] OR [условие2]...OR [условиеN]

SELECT cтолбец1, cтолбец2, cтолбецN

FROM имя_таблицы

WHERE [условие1] OR [условие2]...OR [условиеN]

Вы можете комбинировать N-ное количество условий, используя оператор OR. Для действия, выполняемого инструкцией SQL, будь то транзакция или запрос, должно выполняться одно и ТОЛЬКО одно из условий, разделенных OR.

Пример

Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:

Следующий код содержит запрос, который будет извлекать поля ID, Name и Salary из таблицы CUSTOMERS, для которых зарплата больше 2000, а возраст составляет менее 25 лет.

SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000 OR age < 25;

SELECT ID, NAME, SALARY

FROM CUSTOMERS

WHERE SALARY > 2000 OR age < 25;

Этот код дает следующий результат -

Источник: https://www.tutorialspoint.com/

Редакция: Команда webformyself.

Бесплатный курс по PHP программированию

Освойте курс и создайте динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Хотите изучить MySQL?

Прямо сейчас посмотрите 24-х часовой курс по базе данных MySQL!

Смотреть курс

webformyself.com

OR SQL Server | Oracle PL/SQL •MySQL •SQL Server

В этом учебном пособии вы узнаете, как использовать условие OR в SQL Server (Transact-SQL) с синтаксисом и примерами.

Описание

Условие SQL Server (Transact-SQL) OR используется для проверки нескольких условий, когда записи возвращаются при выполнении любого из условий. OR может использоваться в операторах SELECT, INSERT, UPDATE или DELETE.

Синтаксис

Синтаксис условия OR в SQL Server (Transact-SQL):

WHERE condition1OR condition2…OR condition_n;

Параметры или аргументы

condition1, condition2, … condition_n — любое из условий, которое должно быть выполнено для выбранных записей.

Примечание

  • Условие SQL Server OR позволяет вам протестировать 2 или более условий.
  • Условие SQL Server OR требует, чтобы какое-либо из условий (то есть: condition1, condition2, condition_n) должно быть выполнено для записи, которая должна быть включена в результирующий набор.

Пример оператора SELECT

Первый пример SQL Server OR, который мы рассмотрим, включает оператор SELECT с двумя условиями.Например:

SELECT * FROM employees WHERE last_name = 'Иванов' OR last_name = 'Петров';

SELECT *

FROM employees

WHERE last_name = 'Иванов'

OR last_name = 'Петров';

Этот пример SQL Server OR вернет всех employees (сотрудников), чье last_name является ‘Иванов’ или ‘Петров’. Поскольку в SELECT используется *, все поля из таблицы employee появятся в наборе результатов.

Пример оператора SELECT (3 условия)

Следующий пример SQL Server OR рассматривает оператор SELECT с тремя условиями. Если выполнено какое-либо из этих условий, запись будет включена в результирующий набор.Например:

SELECT last_name, first_name FROM employees WHERE last_name = 'Живков' OR state = 'Рязань' OR employee_id = 50;

SELECT last_name, first_name

FROM employees

WHERE last_name = 'Живков'

OR state = 'Рязань'

OR employee_id = 50;

Этот пример условия SQL Server OR должен возвращать все значения last_name и first_name из таблицы employees, где last_name — ‘Живков’, или state ‘Рязань’, или employee_id равно 50.

Пример оператора INSERT

Условие SQL Server OR может использоваться в операторе INSERT.Например:

INSERT INTO contacts (contact_id, last_name, first_name) SELECT employee_id, last_name, first_name FROM employees WHERE last_name = 'Захаров' OR employee_id < 10;

INSERT INTO contacts

(contact_id, last_name, first_name)

SELECT employee_id, last_name, first_name

FROM employees

WHERE last_name = 'Захаров'

OR employee_id < 10;

Этот пример SQL Server OR будет вставляться в таблицу contacts, все записи employee_id, last_name и first_name из таблицы employees, где last_name — ‘Захаров’ или employee_id меньше 10.

Пример оператора UPDATE

Условие SQL Server OR может использоваться в операторе UPDATE.Например:

UPDATE employees SET state = 'Краснодарский' WHERE employee_id < 1000 OR city = 'Сочи';

UPDATE employees

SET state = 'Краснодарский'

WHERE employee_id < 1000

OR city = 'Сочи';

Этот пример SQL Server OR будет обновлять все значения state в таблице employees в ‘Краснодарский’, где employee_id меньше 1000 или city — ‘Сочи’.

Пример оператора DELETE

Условие SQL Server OR может использоваться в операторе DELETE.Например:

DELETE FROM employees WHERE first_name = 'Кристина' OR first_name = 'Алина';

DELETE FROM employees

WHERE first_name = 'Кристина'

OR first_name = 'Алина';

Этот пример условия SQL Server OR приведет к удалению всех сотрудников из таблицы employees, чье имя является ‘Кристина’ или ‘Алина’.

oracleplsql.ru

sql-server - Где поставить бизнес-логику? В VB.Net? Или в SQL?

Я создаю приложение, которое позволяет мне создавать запланированные задачи. У меня есть поточный процесс, который работает в фоновом режиме каждую минуту и запускает следующий класс:

Namespace MyName.space Public Class RunJob ... End Class End Namespace

Задание может быть либо "Run Once", либо "Recurring".

Я запрашиваю таблицу заданий в vb.net, сохраняя результаты в наборе данных, чтобы я мог перебирать их по одному за раз. Затем я начал думать о функциях, чтобы проверить, должно ли работать работа или нет, исходя из ее уникальных критериев.

Например, самым простым из всех было бы задание "Run Once":

If Type = "Run Once" JobShouldRun = Helpers.Validate_RunOnce(WhenToRun, RunCount) ElseIf Type = "Recurring" ... End If

Функция будет проверять, находится ли "WhenToRun" в течение 5 минут с текущей даты и времени, настроенных на сервере. Я выбрал 5-минутное окно в случае сбоя задачи, чтобы через минуту он попытался снова и все еще осталось 3-4 попытки.

Но потом я начал думать, что я могу контролировать больше этого в SQL Query, чтобы получить сами задания, и пропустить проверку этого "легкого" на vb.net, но я не уверен, какой метод будет более оптимальным. Поэтому я мог бы ограничить набор результатов, начиная с моего первоначального запроса:

SELECT JobId ,JobType -- Run Once or Recurring ,WhenToRun FROM JobTable a WHERE Active = 1 AND ( JobType = 'Run Once' AND TotalRuns = 0 AND DATEDIFF(minute, getdate(), a.WhenToRun) BETWEEN 1 AND 5 ) OR JobType = 'Recurring'

Затем я начал думать, должен ли я выполнять всю свою логику с помощью UNION или JOINS, или сложной установки WHERE/AND/OR на повторяющихся работах? Они становятся немного сложнее... Например, еженедельно, в какие дни недели, в какое время и т.д. Или каждый "инт" лет в "Янв. Марш и т.д." В последний день месяца.

Поэтому я начал думать так:

SELECT JobID ,JobType ... FROM JobTable WHERE RecurringType = 'Weekly' AND ... more conditions based on all the custom job settings UNION ALL SELECT JobID ,... FROM JobTable WHERE RecurringType = 'Monthly' AND ... more conditions based on all the custom job settings

Этот запрос оказался бы довольно большим и сложным, но мой вопрос: должен ли я обрабатывать это в vb.net или SQL, или просто в SQL и более сложных условиях в vb.net? Я не уверен в производительности обоих направлений.

qaru.site

sql-server - ИЛИ короткое замыкание оператора в SQL Server

Очевидно, что сервер MS Sql поддерживает теорию коротких замыканий, чтобы повысить производительность, избегая ненужной проверки,

Поддерживающий пример:

SELECT 'TEST' WHERE 1 = 'A' SELECT 'TEST' WHERE 1 = 1 OR 1 = 'A'

Здесь первый пример приведет к ошибке "Ошибка конверсии при преобразовании значения varchar" A "в тип данных int. '

В то время как вторая выполняется легко, так как условие 1 = 1 оценивается как ИСТИНА, и, следовательно, второе условие не работает вообще.

Далее

SELECT 'TEST' WHERE 1 = 0 OR 1 = 'A'

здесь первое условие будет оцениваться как ложное, и, следовательно, СУБД пойдет на второе условие и снова вы получите ошибку преобразования, как в приведенном выше примере.

ПРИМЕЧАНИЕ. Я РАЗРУШАЮЩИЙ УСЛОВИЕ ТОЛЬКО ДЛЯ РЕАЛИЗИРОВАНИЯ ПОГОДЫ СОСТОЯНИЕ ВЫПОЛНИТСЯ ИЛИ КРАТКОСРОЧНО ЕСЛИ РЕЗУЛЬТАТЫ QUERY В ОШИБКЕ СОХРАНЯЮТ СОСТОЯНИЕ, ВЫПОЛНЕННОЕ, КОРОТКО-ЦИРКУЛИРОВАННОЕ ИНОЕ.

ПРОСТОЕ ОБЪЯСНЕНИЕ

Рассмотрим,

WHERE 1 = 1 OR 2 = 2

поскольку первое условие оценивается как TRUE, его бессмысленно оценивать второе условие, потому что его оценка в любом значении не повлияет на результат вообще, поэтому его хорошая возможность для Sql Server сохранить время выполнения запроса, пропустив ненужную проверку состояния или оценку.

в случае "ИЛИ" , если первое условие оценивается как ИСТИНА, вся цепочка, связанная "ИЛИ" , считается оцененной как true, не оценивая других.

condition1 OR condition2 OR ..... OR conditionN

если условие 1 оценивается как истинное, оставим все условия до тех пор, пока условие N не будет пропущено. В обобщенных словах при определении первого TRUE все остальные условия, связанные с OR, будут пропущены.

Рассмотрим второе условие

WHERE 1 = 0 AND 1 = 1

поскольку первое условие получает evalutated до FALSE его бессмысленно оценивать второе условие, потому что его оценка в любом значении не повлияет на результат вообще, поэтому снова его хорошая возможность для Sql Server сохранить время выполнения запроса, пропустив ненужную проверку состояния или оценку.

в случае "И" , если первое условие оценивается как ЛОЖЬ, вся цепочка, связанная с "И" , считается оцененной к FALSE без оценки других.

condition1 AND condition2 AND ..... conditionN

если условие 1 оценивается как FALSE, остальные условия сохраняются до тех пор, пока условиеN не будет пропущено. В обобщенных словах при определении первого FALSE все остальные условия, связанные с И, будут пропущены.

ПОЭТОМУ, ПРОСТРАНСТВУЮЩИЙ ПРОГРАММА ДОЛЖНА ВСЕГДА ПРОГРАММА СЕТИ УСЛОВИЙ В ТАКОЙ ПУТЬ, ЧТО, МЕНЕЕ РАСПРОСТРАНЕННОЕ ИЛИ НАИБОЛЕЕ ЛИКВИДАЦИОННОЕ СОСТОЯНИЕ ПОЛУЧАЕТ ОЦЕНКУ ПЕРВОГО, ИЛИ СОХРАНЯЙТЕ СОСТОЯНИЕ В ТАКОЙ ПУТЕМ, КОТОРЫЙ МОЖЕТ ПРИНЯТЬ МАКСИМАЛЬНОЕ ПРЕИМУЩЕСТВО КОРОТКОГО ЦЕПЬ

Спасибо и с уважением,

Rk_Hirpara

qaru.site

Как в SQL получить первые (или последние) строки запроса? TOP или OFFSET? | Info-Comp.ru

Всем привет, сегодня мы поговорим о том, как в Microsoft SQL Server на языке T-SQL можно оставить только определенное количество первых строк результирующего набора данных. При этом мы рассмотрим два способа реализации этой простой задачи. Также я покажу Вам, как можно вывести, наоборот, только последние строки SQL запроса.

В языке T-SQL существует две стандартные возможности, которые позволяют нам применить фильтр к результирующему набору данных, иными словами, оставить в результате только определённое количество строк. Это могут быть первые строки, с учётом сортировки, что достаточно часто требуется при работе с базами данных на SQL, или последние строки, а также существует возможность вывести любой набор строк, например, пропустить первые строки и вывести определённое количество следующих строк.

Как я уже отметил, существует два способа фильтрации результирующего набора данных, первый – это использование фильтра TOP, и второй – это использование конструкции OFFSET-FETCH, которую мы подробно рассмотрели в отдельном материале - «OFFSET-FETCH в T-SQL – описание и примеры использования».

Содержание

Получаем первые строки результата SQL запроса

Сейчас давайте я покажу, как можно вывести первые строки результирующего набора данных, сначала мы рассмотрим пример с использованием TOP, а затем сделаем то же самое только с помощью OFFSET-FETCH.

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

Исходные данные для примеров

В качестве сервера у меня выступает Microsoft SQL Server 2016 Express. А теперь давайте представим, что у нас есть таблица TestTable и в ней содержатся следующие данные (перечень товаров с указанием цены).

--Создание таблицы CREATE TABLE TestTable( [ProductId] [INT] IDENTITY(1,1) NOT NULL, [ProductName] [VARCHAR](100) NOT NULL, [Price] [Money] NULL ) GO --Добавление строк в таблицу INSERT INTO TestTable(ProductName, Price) VALUES ('Системный блок', 300), ('Монитор', 200), ('Клавиатура', 100), ('Мышь', 50), ('Принтер', 200), ('Сканер', 150), ('Телефон', 250), ('Планшет', 300) GO --Выборка данных SELECT * FROM TestTable

Получаем первые строки запроса с помощью TOP

TOP – это инструкция T-SQL, с помощью которой можно ограничить число строк в результирующем наборе данных SQL запроса.

Синтаксис

TOP (Число строк) [PERCENT]

[ WITH TIES ]

У инструкции TOP несколько параметров:

  • Число строк – сразу после ключевого слова TOP в скобочках мы указываем число, которое будет означать количество строк в итоговом результате. В инструкции SELECT допускается указание данного числа без скобочек, однако это не рекомендуется;
  • PERCENT – параметр, который говорит, что в запросе необходимо оставить не фактическое количество строк, а процент строк от общего количества, т.е. число, указанное ранее, будет означать процент, а не количество;
  • WITH TIES – параметр, который говорит, что в результирующий набор необходимо включить и записи с тем же значением, что и последняя строка, в случае наличия подобных записей. Например, если Вам нужно получить 5 самых дорогих товаров, при этом на пятом месте запись с ценой 100, а на шестом месте также цена 100, так вот, без параметра WITH TIES Вам вернётся 5 строк, а если данный параметр указать - вернется 6 строк.

Фильтр TOP обычно применяется с сортировкой данных (ORDER BY), однако это необязательно, можно применять данный фильтр и без сортировки данных, только в этом случае строки будут возвращаться в произвольном порядке (так, как они хранятся).

Пример SQL запроса с TOP – выводим первые 5 строк

Допустим, нам нужно получить 5 самых дорогих товаров, для этого пишем следующий запрос.

SELECT TOP (5) ProductId, ProductName, Price FROM TestTable ORDER BY Price DESC

В данном случае мы указали сортировку по уменьшению цены (ORDER BY Price DESC), а также применили фильтр TOP (5), для ограничения вывода строк результирующего набора.

Пример SQL запроса с TOP и параметром WITH TIES

Сейчас давайте запустим два запроса, в обоих случаях мы будем запрашивать 4 самых дорогих товара, т.е. применим фильтр TOP (4), однако во втором запросе дополнительно мы укажем параметр WITH TIES и посмотрим на разницу итогового результата.

--Без WITH TIES SELECT TOP (4) ProductId, ProductName, Price FROM TestTable ORDER BY Price DESC --С WITH TIES SELECT TOP (4) WITH TIES ProductId, ProductName, Price FROM TestTable ORDER BY Price DESC

В итоге мы очень хорошо видим разницу, в первом случае вывелось 4 строки, а во втором 5, так как товар в 5 строке имеет точно такую же цену, как и товар в 4 строке.

Пример SQL запроса с TOP и параметром PERCENT

В этом примере давайте просто выведем 50 процентов итогового набора записей, т.е. половину. Для этого мы используем параметр PERCENT.

SELECT TOP (50) PERCENT ProductId, ProductName, Price FROM TestTable ORDER BY Price DESC

Так как у нас в таблице TestTable всего 8 записей, нам вывелось 4 строки, т.е. как раз 50 процентов.

Получаем первые строки запроса с помощью OFFSET-FETCH

Вторым способом получения первых строк является использование конструкции OFFSET-FETCH, однако она появилась только в 2012 версии SQL сервер, до этого, соответственно, этот способ использовать не получится.

У конструкции OFFSET-FETCH отсутствуют такие параметры, как PERCENT и WITH TIES, которые есть у фильтра TOP, однако у OFFSET-FETCH есть одно очень важное преимущество – это возможность пропускать определенное количество первых строк.

Примечание! OFFSET-FETCH - это часть конструкции ORDER BY, поэтому без сортировки использовать OFFSET-FETCH не удастся. Также не получится одновременно использовать OFFSET-FETCH и TOP в одном запросе SELECT.

Пример SQL запроса с OFFSET-FETCH - выводим первые 5 строк

Чтобы вывести первые строки с помощью конструкции OFFSET-FETCH, нам нужно в секции OFFSET указать 0, т.е. начинать вывод сразу с первой строки (если указать другое число, то именно такое количество строк будет пропущено). В секции FETCH мы соответственно указываем 5.

SELECT ProductId, ProductName, Price FROM TestTable ORDER BY Price DESC OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;

Результат, мы видим, точно такой же, как и в случае с TOP.

Как вывести последние строки SQL запроса?

Если Вам нужно получить не первые строки результирующего набора данных, а последние (например, последние записи в таблице), причем с той же самой сортировкой, то Вы также можете использовать два способа, т.е. и TOP, и OFFSET. В обоих случаях нам нужно будет немного усложнить запросы.

Получаем последние строки SQL запроса с помощью TOP

В случае с TOP нам дополнительно потребуется использовать конструкцию WITH (CTE – обобщенное табличное выражение), для того чтобы выполнить сортировку по идентификатору для применения фильтра TOP, т.е. отобрать самые последние записи. А после этого мы уже можем отсортировать строки так, как нам нужно.

WITH SRC AS ( --Получаем 5 последних строк в таблице SELECT TOP (5) ProductId, ProductName, Price FROM TestTable ORDER BY ProductId DESC ) SELECT * FROM SRC ORDER BY ProductId --Применяем нужную нам сортировку

Как видите, нам вывелись 5 последних строк.

Получаем последние строки SQL запроса с помощью OFFSET-FETCH

Для получения последних строк с помощью OFFSET-FETCH нам потребуется предварительно узнать общее количество строк, для того чтобы определить, сколько строк нужно пропустить. Это можно сделать как с помощью вложенного запроса, так и с помощью предварительного сохранения нужного нам значения в переменной. Я покажу способ с использованием переменной.

--Объявляем переменную DECLARE @CNT INT; --Узнаем количество строк в таблице SELECT @CNT = COUNT(*) FROM TestTable; --Получаем 5 последних строк SELECT ProductId, ProductName, Price FROM TestTable ORDER BY ProductId OFFSET @CNT - 5 ROWS FETCH NEXT 5 ROWS ONLY;

Итоговый результат такой же, как и в запросе с TOP.

Теперь Вы знаете, как с помощью TOP и OFFSET получать первые и последние строки результирующего набора данных, который возвращает SQL запрос.

В данной статье мы затронули одну очень маленькую возможность языка T-SQL, но их, как Вы понимаете, гораздо больше, поэтому, если Вы начинающий программист и хотите изучить язык T-SQL, то рекомендую почитать мою книгу «Путь программиста T-SQL», в ней я подробно, максимально доступным и простым языком, рассказываю практически про все конструкции языка T-SQL.

У меня на этом все, удачи в освоении языка T-SQL!

Похожие статьи:

info-comp.ru

sql - Как сделать побитовое исключающее ИЛИ в sql-сервере между двумя двоичными типами?

Комментарий в вопросе от Мартина, дал мне представление о том, как разбить двоичный файл, чтобы я мог XOR значения. Первоначально я хотел XOR два GUID в sql. Итак, вот код, с которым я пришел:

declare @guid1 uniqueidentifier declare @guid2 uniqueidentifier declare @guid3_hi binary(8) declare @guid3_lo binary(8) declare @guid3_temp varchar(32) declare @guid3_char varchar(36) declare @guid3 uniqueidentifier set @guid1 = '96B4316D-1EA7-4CA3-8D50-FEE8047C1329' set @guid2 = 'FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF' set @guid3_hi = CAST(SUBSTRING(CAST(@guid1 as binary(16)),1,8) as bigint) ^ CAST(SUBSTRING(CAST(@guid2 as binary(16)),1,8) as bigint) set @guid3_lo = CAST(SUBSTRING(CAST(@guid1 as binary(16)),9,8) as bigint) ^ CAST(SUBSTRING(CAST(@guid2 as binary(16)),9,8) as bigint) set @guid3_temp = SUBSTRING(dbo.sp_hexadecimal(@guid3_hi), 3, 16) + SUBSTRING(dbo.sp_hexadecimal(@guid3_lo), 3, 16) select @guid3_temp set @guid3_char = SUBSTRING(@guid3_temp, 1, 8) + '-' + SUBSTRING(@guid3_temp, 9, 4) + '-' + SUBSTRING(@guid3_temp, 13, 4) + '-' + SUBSTRING(@guid3_temp, 17, 4) + '-' + SUBSTRING(@guid3_temp, 21, 12) select @guid3_char set @guid3 = convert(uniqueidentifier, @guid3_char) select @guid3 --result 92CE4B69-58E1-5CB3-72AF-0117FB83ECD6

Функция преобразования двоичной в шестнадцатеричную строку: Преобразование двоичных данных в шестнадцатеричную строку

Я знаю, что в SQL 2008 мы можем использовать функцию преобразования для этого, поскольку это сообщение объясняется: SQL Server 2008: новое двоичное преобразование с шестнадцатеричной строкой, но это не было вариантом в моем случае.

Однако будет хорошо, если кто-то лучше поймет, как мы можем использовать побитовые операции SQL в двоичном типе данных.

EDIT:

Благодаря cyberkiwi для обеспечения правильного алгоритма и для указания ошибки в моем коде. Этот код может быть полезен для двоичного кода XOR-ing, но не для GUID, поскольку идентификаторы GUID имеют порядок байтов для первого и последнего 8 байтов. Пожалуйста, ознакомьтесь с объяснением википедии: базовая структура GUID. Обратите внимание: если вы собираетесь использовать результат XOR-ed в качестве реального GUID, вы должны принимать и учитывать бит версии.

qaru.site