Динамический SQL, где условие со значениями из другой таблицы - PullRequest
0 голосов
/ 15 марта 2019

Я хочу построить динамический запрос SQL, где я могу использовать данные из другой таблицы в качестве условия. Предположим, у меня есть две таблицы: одна таблица с финансовыми данными, а другая с условиями. Они выглядят примерно так:

Таблица sales

c006    mesocomp    c048      c020   c021
-----  ---------- -------    -----   ----
120     01TA       MICROSOFT  2      239

и таблица condition со следующими данными:

   dimension   operator    wert_db 
   ---------   --------    ------- 
   sales.c006     <           700 
   sales.c048   not like    'MIC%'
   sales.c021   in         (203,206)   

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

SELECT * 
FROM sales 
WHERE sales.c006 < 700 
  AND sales.c048 NOT LIKE 'MIC%' 
  AND sales.c021 IN (203, 206)

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

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

В вашем вопросе уже упоминается использование динамического SQL, поэтому я предполагаю, что вы знаетехотя бы то, что это.Вы собираетесь заполнить строковую переменную, начиная с 'SELECT * FROM Sales '.

. Вы можете использовать метод STUFF ... FOR XML PATH , чтобы собрать строки conditions в WHERE.clause.

Одним из изменений в связанном примере является то, что вам нужно объединить dimension, operator и wert_db в один искусственный столбец в самом внутреннем SELECT.Также вместо разделения через запятую вы будете разделять ' AND '.И измените параметры функции STUFF, чтобы длина ' AND ' вместо длины запятой.

0 голосов
/ 15 марта 2019
DECLARE @tblSales TABLE
(
    c006     VARCHAR(10),
    mesocomp VARCHAR(100),
    c048     VARCHAR(100),
    c020     VARCHAR(100),
    c021     VARCHAR(100)
)

INSERT INTO @tblSales(c006, mesocomp, c048, c020, c021)
VALUES(120,'01Ta','Microsoft','2','239')

SELECT * FROM @tblSales

DECLARE @tblCondition TABLE
(
    Id INT,
    dimension VARCHAR(100),
    operator  VARCHAR(10),
    wert_db   VARCHAR(100)
)

INSERT INTO @tblCondition(Id, dimension, operator, wert_db) VALUES(1,'sales.c006','<','700')
INSERT INTO @tblCondition(Id, dimension, operator, wert_db) VALUES(1,'sales.c048','not like','''MIC%''')
INSERT INTO @tblCondition(Id, dimension, operator, wert_db) VALUES(1,'sales.c021','in','(203,206)')

DECLARE @whereCondition VARCHAR(400)    
SELECT @whereCondition = COALESCE(@whereCondition + ' ', '') + dimension + ' ' + operator + ' ' + wert_db + ' AND '
FROM @tblCondition
SET @whereCondition = SUBSTRING(@whereCondition,0, LEN(@whereCondition) - 3) 

PRINT @whereCondition

DECLARE @sql VARCHAR(4000)
SET @sql = 'SELECT * FROM @tblSales Where ' + @whereCondition

PRINT @sql
EXEC(@sql)
--please use real tables so you will get everything working.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...