kkakadiya Ответов: 2

Содержать в запятых отдельную строку


Привет,

Я передаю параметр серийный нет. как '18,8 АБ' отдельной строкой с разделителями.

в моей таблице есть серийные номера данных
8018A7400BC3
8018A79B6433
001DD55C6FAB
HDE09B356634
4650C7453C90
3275D8AB544D
4345D8AB544C

Таким образом, он должен возвращать результат как
8018A7400BC3
8018A79B6433
3275D8AB544D
4345D8AB544C

есть идеи?

Спасибо

Что я уже пробовал:

попытался с содержат и как запрос.

F-ES Sitecore

Вам нужно будет объяснить, почему "18,8 AB" возвращает эти конкретные результаты из этих данных.

ZurdoDev

Google how to split a string in SQL.

2 Ответов

Рейтинг:
2

Maciej Los

Еще один способ добиться этого на стороне сервера SQL server - использовать рекурсивные запросы с именем обобщенное табличное выражение[^].
Для получения более подробной информации, пожалуйста, смотрите:
Использование Общих Табличных Выражений[^]
С common_table_expression (Transact-SQL) | Microsoft Docs[^]

Я согласен с этим OriginalGriff[^] (Решение № 1), что вы должны сделать это на языке презентации (см. Пример В c#).

Примеры:


DECLARE @data TABLE (SerialNo VARCHAR(30));

INSERT INTO @data (SerialNo)
VALUES('8018A7400BC3'),
('8018A79B6433'),
('001DD55C6FAB'),
('HDE09B356634'),
('4650C7453C90'),
('3275D8AB544D'),
('4345D8AB544C');


DECLARE @find VARCHAR(30) = '18,8AB';

;WITH CTE AS 
(
	SELECT LEFT(@find, CHARINDEX(',', @find)-1) AS SerialPart, RIGHT(@find, LEN(@find) - CHARINDEX(',', @find)) AS Remainder
	WHERE CHARINDEX(',', @find)>0
	UNION ALL
	SELECT LEFT(Remainder, CHARINDEX(',', Remainder)-1) AS SerialPart, RIGHT(Remainder, LEN(Remainder) - CHARINDEX(',', Remainder)) AS Remainder
	FROM CTE
	WHERE CHARINDEX(',', Remainder)>0
	UNION ALL
	SELECT Remainder AS SerialPart, NULL AS Remainder
	FROM CTE
	WHERE CHARINDEX(',', Remainder)=0 
)
SELECT Orig.*
FROM @data AS Orig INNER JOIN CTE AS Parts ON Orig.SerialNo Like '%' + Parts.SerialPart + '%';


//create sample data
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("SerialNo", typeof(string)));
dt.Rows.Add(new object[]{"8018A7400BC3"});
dt.Rows.Add(new object[]{"8018A79B6433"});
dt.Rows.Add(new object[]{"001DD55C6FAB"});
dt.Rows.Add(new object[]{"HDE09B356634"});
dt.Rows.Add(new object[]{"4650C7453C90"});
dt.Rows.Add(new object[]{"3275D8AB544D"});
dt.Rows.Add(new object[]{"4345D8AB544C"});

string find = @"18,8AB";

var result = dt.AsEnumerable()
	.Where(x => find.Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries).Any(y=> x.Field<string>("SerialNo").Contains(y)))
	.ToList();
	
foreach(DataRow dr in result)
{
	Console.WriteLine("{0}", dr.Field<string>("SerialNo"));
}



Удачи вам!


Рейтинг:
0

OriginalGriff

Вам придется разделить строку и использовать ее части для построения SQL-команды с двумя точками where ... Как клаузулы

SELECT ... WHERE SerialNo LIKE '%18%' OR SerialNo LIKE '%8AB%'
Затем вам нужно будет выполнить эту команду SQL.

Это беспорядок: SQL не очень хорош в обработке строк, так что это не "хороший" способ сделать это. Это делает что-то похожее: Использование разделенных запятыми строк параметров значений в предложениях SQL IN[^] и вы могли бы изменить это, но ...

Честно? Я бы сделал это на своем языке презентации, а не на SQL.


Maciej Los

5ed!