根据其他表中的条件构造SQL Select查询

时间:2018-12-06 07:19:53

标签: sql-server

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
  • FieldType:1 = Text, 2 = Number
  • FieldCondition: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

Fiddle Link

1 个答案:

答案 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)

这不是一种优雅的解决方案,但可以正常工作

相关问题