SQL Server查询所需的帮助。
Users
表:
UserID FirstName LastName
----------- ---------- ----------
1 Sasasd asdfhy
2 Sachnahi Jhootey
3 csajd mkjcy
4 Scsajd aiuyay
5 csdcsajd aiuyawe
自定义查询表:
FieldOrigin|FieldID|FieldType|FieldCondition|FieldNumberValue|FieldTextValue
1 |2 |1 |2 |null |s
1 |3 |1 |3 |null |y
1 = Text, 2 = Number
1 - Contains, 2 - Starts with, 3 - Ends with, 4 - Equals
我在编写查询以获取Users
表中的UserID时需要帮助,这要遵守自定义查询表中的条件。
查询:从Users
中查找用户ID,其名称以s
开头并以y
我尝试编写此查询,但这不起作用:
SELECT U.UserID
FROM CUSTOM_TABLE C, Users U
WHERE C.FieldOrigin = 1
AND (CASE C.FieldID
WHEN 2
THEN
(CASE
WHEN C.FieldCondition = 1 AND U.FirstName LIKE '%' + C.FieldTextValue +'%'
THEN 1
WHEN C.FieldCondition = 2 AND U.FirstName LIKE C.FieldTextValue +'%'
THEN 1
WHEN C.FieldCondition = 3 AND U.FirstName LIKE '%' + C.FieldTextValue
THEN 1
WHEN C.FieldCondition = 4 AND U.FirstName = C.FieldTextValue
THEN 1
ELSE 0
END)
WHEN 3
THEN
(CASE
WHEN C.FieldCondition = 1 AND U.LastName LIKE '%' + C.FieldTextValue +'%'
THEN 1
WHEN C.FieldCondition = 2 AND U.LastName LIKE C.FieldTextValue +'%'
THEN 1
WHEN C.FieldCondition = 3 AND U.LastName LIKE '%' + C.FieldTextValue
THEN 1
WHEN C.FieldCondition = 4 AND U.LastName = C.FieldTextValue
THEN 1
ELSE 0
END)
ELSE 0
END) = 1
GROUP BY
U.UserID
这将返回1,2,3,4
,但正确的答案是1,2,4
答案 0 :(得分:3)
declare @query varchar(1000)
declare @i int = 0
Set @query = 'SELECT U.UserID from Users U where '
select @query = @query + case @i when 0 THEN '' ELSE ' AND ' END +
CASE C.FieldID
WHEN 2 THEN
(CASE
WHEN C.FieldCondition = 1 THEN 'U.FirstName LIKE ''%' + C.FieldTextValue +'%'''
WHEN C.FieldCondition = 2 THEN 'U.FirstName LIKE ''' + C.FieldTextValue +'%'''
WHEN C.FieldCondition = 3 THEN 'U.FirstName LIKE ''%' + C.FieldTextValue +''''
WHEN C.FieldCondition = 4 THEN 'U.FirstName =''' + C.FieldTextValue +''''
ELSE ''
END)
WHEN 3 THEN
(CASE
WHEN C.FieldCondition = 1 THEN 'U.LastName LIKE ''%' + C.FieldTextValue +'%'''
WHEN C.FieldCondition = 2 THEN 'U.LastName LIKE ''' + C.FieldTextValue +'%'''
WHEN C.FieldCondition = 3 THEN 'U.LastName LIKE ''%' + C.FieldTextValue +''''
WHEN C.FieldCondition = 4 THEN 'U.LastName =''' + C.FieldTextValue +''''
ELSE ''
END)
ELSE ''
END, @i=@i+(
CASE WHEN (C.FieldID = 2 OR C.FieldID = 3) AND
(C.FieldCondition = 1 OR C.FieldCondition = 2 OR C.FieldCondition = 3 OR C.FieldCondition = 4) THEN 1
ELSE 0 END
)
from CUSTOM_TABLE C where C.FieldOrigin = 1
exec (@query)
这不是一种优雅的解决方案,但可以正常工作