SQL Server: возвращение нескольких строк по ROWID с использованием только одной переменной / LIKE OPERATOR - PullRequest
0 голосов
/ 10 января 2019

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

enter image description here

Я хочу получить все 3 строки, выполнив один запрос, эти идентификаторы получены как параметры процедуры, иногда я могу получить 1 идентификатор, а иногда я могу получить 10 из них, в зависимости от того, что пользователи отправляют в базу данных.

Я написал что-то вроде этого:

SELECT * 
FROM Products
WHERE CONVERT(NVARCHAR(MAX), ProductId) LIKE '%' + 'A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667' + '%'

SELECT * 
FROM Products
WHERE 'A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667' LIKE '%' + CONVERT(NVARCHAR(MAX), ProductId) + '%' 

Почему второй пример возвращает строки, как ожидалось, а первый пример не возвращает никаких строк?

Определение гласит: %or% finds any values that have "or" in any position

Как это на самом деле работает? Кто-нибудь может объяснить?

EDIT:

Я думал, что этот оператор LIKE должен использоваться в моем столбце как

Выбрать * Из продуктов Где ProductId как '%' + 'SomeStringId' + '%';

потому что оператор LIKE используется в предложении WHERE для поиска указанного шаблона в столбце, а мой столбец - ProductId, поэтому я не могу понять, как получился такой пример:

Выбрать * Из продуктов Где SomeStringId - как «%» + ProductId + «%»;

Почему вышеприведенный пример работает, если Like не используется в моем столбце, он используется в некоторой строке ...

1 Ответ

0 голосов
/ 11 января 2019

Вы должны разбить строку и затем использовать внутреннее соединение.

Для SQL Server ниже 2016 года с громоздкой строкой, разделенной по XML:

SELECT p.*
       FROM products p
            INNER JOIN (SELECT arg_xml_node.xml_node.value('(.)[1]', 'uniqueidentifier') uniqueidenfier
                               FROM (SELECT convert(xml,
                                            concat('<x>',
                                                   replace('A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667',
                                                           ', ',
                                                           '</x><x>'),
                                                   '</x>')) xml) arg_xml
                                    CROSS APPLY arg_xml.xml.nodes('x') arg_xml_node (xml_node)) arg_uniqueidenfier
                       ON arg_uniqueidenfier.uniqueidenfier = p.productid;

Для SQL Server 2016 и выше с элегантным способом, используя string_split():

SELECT p.*
       FROM products p
            INNER JOIN (SELECT convert(uniqueidentifier, ltrim(value)) uniqueidenfier
                               FROM string_split('A9472294-CFDD-40AC-BC2D-00E39AF4A300, 9A817E40-E4B1-4487-A376-010DD6377E38, 078A3C75-C442-4D88-A1E0-0118B8706667',
                                                 ',')) arg_uniqueidenfier
                       ON arg_uniqueidenfier.uniqueidenfier = p.productid;

дб <> скрипка

...