Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Преобразовать выражение в SQL  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Здравствуйте.

Конец рабочего дня, ничего на ум не приходит))
Имеется произвольное выражение(выражение представляет из себе SQL в котором столбцы заменены на з-я [tpar_order])
, надо преобразовывать в SQL,

пример выражения:
(
	([12] LIKE '%лужнец%' OR [12] LIKE '%фрунз%')
		AND
	([24] LIKE '%лужнец%' OR [24] LIKE '%фрунз%')
)

PIVOT нужен что ли, ума не приложу

Пригодятся любые советы, спасибо

К сообщению приложен файл. Размер - 16Kb
15 июн 16, 18:21    [19297030]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать выражение в SQL  [new]
aleks2
Guest
Ну дык напиши replace-ом
(
	( tpar_order = 12 and tpar_value LIKE '%лужнец%' OR tpar_value LIKE '%фрунз%')
)
16 июн 16, 09:04    [19298591]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать выражение в SQL  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
aleks2
Ну дык напиши replace-ом
(
	( tpar_order = 12 and tpar_value LIKE '%лужнец%' OR tpar_value LIKE '%фрунз%')
)

дык просто replace не катит, ибо запрос может быть сильно сложным

(
	([12] LIKE '%лужнец%' OR [12] LIKE '%фрунз%')
		AND
	([24] LIKE '%лужнец%' OR [24] LIKE '%фрунз%')
)



		(
			(tpar_order = 12 AND (tpar_order LIKE '%лужнец%' OR tpar_order LIKE '%фрунз%'))
				AND
			(tpar_order = 24 AND (tpar_order LIKE '%лужнец%' OR tpar_order LIKE '%фрунз%'))
		)


я думаю tpar_order (12 и 24 и ...) надо превратить в столбцы и применять фильтр без изменений
сейчас что ниб напишу
16 июн 16, 10:04    [19298881]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать выражение в SQL  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
без PIVOT сделал
-- входные параметры
DECLARE @filter_query NVARCHAR(MAX) = N'([12] LIKE ''%лужнец%'' OR [12] LIKE ''%фрунз%'') AND ([24] LIKE ''%лужнец%'' OR [24] LIKE ''%фрунз%'') AND ([11] LIKE ''%иван%'' OR [11] LIKE ''%петр%'')'
DECLARE @task_id UNIQUEIDENTIFIER = 'ddbd81aa-62d5-44cf-8e30-0aa23f1f6121';

DECLARE @fields NVARCHAR(MAX) =  N'11, 12, 24'
DECLARE @retval INT;
DECLARE @params NVARCHAR(MAX);
DECLARE @sql NVARCHAR(MAX) =
N'
-- выбираем з-я параметров учавствующих в фильтре
; WITH CTE_pivotData
AS
(
	SELECT COALESCE(tp.tpar_value, tp.tpar_text_value) AS tpar_value
		  , tp.tpar_order
	FROM TaskParams AS tp
	WHERE 
		tp.tpar_task_id = @task_id
		AND
		(
			[tpar_order] IN (' + @fields + ')
		)
)
-- pivot (меняем строки на столбцы для того что бы пользовательский фильтр применять как есть, без изменений)
SELECT @retvalOUT = COUNT(*)
FROM
(
	SELECT 
		(SELECT tpar_value FROM CTE_pivotData WHERE tpar_order = 11) AS [11]
		,(SELECT tpar_value FROM CTE_pivotData WHERE tpar_order = 12) AS [12]
		,(SELECT tpar_value FROM CTE_pivotData WHERE tpar_order = 24) AS [24]
	FROM 
		(SELECT NULL AS t) AS t
) AS t
WHERE (' + @filter_query + ')'

SET @params = N'
@task_id UNIQUEIDENTIFIER
,@retvalOUT int OUTPUT';
EXEC sp_executesql @sql, @params, @task_id=@task_id, @retvalOUT=@retval OUTPUT;

SELECT @retval;


получается что динамически нужно собрать это:
DECLARE @fields NVARCHAR(MAX) = N'11, 12, 24'
и это:
(SELECT tpar_value FROM CTE_pivotData WHERE tpar_order = 11) AS [11]
,(SELECT tpar_value FROM CTE_pivotData WHERE tpar_order = 12) AS [12]
,(SELECT tpar_value FROM CTE_pivotData WHERE tpar_order = 24) AS [24]

из @filter_query
16 июн 16, 14:56    [19300610]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить