SQL:我可以转换"<"的字符串值吗?运营商在where子句中运营商?

时间:2017-03-07 15:52:57

标签: sql sql-server

我将操作符存储在表格的两行的字符串列中(">","< =")

我正在使用另一个表加入表,并希望将where子句设置为尽可能动态。

我想知道是否可以将字符串值运算符转换为此SQL代码行的实际运算符:

ABS(DATEDIFF(dd,Table2.DUE_DT,GETDATE())) > 120

VS

ABS(DATEDIFF(dd,Table2.DUE_DT,GETDATE())) <= 120

操作员将根据行中匹配的列进行更改。是否可以根据包含正确运算符的字符串值更改运算符?如果是这样,怎么办呢?

以下是Table1

中的两行
NEFL_TYPE   GRGR_ID     NEFL_KEY    NEFL_VALUE  NEFL_COLUMN
"PDRU"      "2600"      "PD"         "RV"        ">"
"PDRU"      "2600"      "RV"         "PD"        "<="

这是我使用的代码片段:

INNER JOIN
    Table1
ON
    Table2.STATUS = Table1.NEFL_KEY
AND
    Table1.NEFL_TYPE = 'PDRU'
WHERE
    Table1.GRGR_ID = '2600'
AND
    ABS(DATEDIFF(dd, Table2.DUE_DT,GETDATE())) > 120

所以Table2.STATUS应该确定在NEFL_COLUMN中使用哪个运算符

1 个答案:

答案 0 :(得分:0)

我不认为这是一种简单的方法,可以针对一般情况执行您想要的操作,甚至不使用动态查询或客户端生成的查询,因为比较是每行,性能将是动态查询的问题。

我看到了解决特定案例的两种方法:

a)制作2个单独的查询并对其进行UNION

SELECT...
INNER JOIN
    Table1
ON
    Table2.STATUS = Table1.NEFL_KEY
AND
    Table1.NEFL_TYPE = 'PDRU'
WHERE
    Table1.GRGR_ID = '2600'
AND
    ABS(DATEDIFF(dd, Table2.DUE_DT,GETDATE())) > 120 AND Table1.NEFL_COLUMN = ">"
UNION
SELECT...
INNER JOIN
    Table1
ON
    Table2.STATUS = Table1.NEFL_KEY
AND
    Table1.NEFL_TYPE = 'PDRU'
WHERE
    Table1.GRGR_ID = '2600'
AND
    ABS(DATEDIFF(dd, Table2.DUE_DT,GETDATE())) <= 120 AND Table1.NEFL_COLUMN = "<="

b)使用2个范围列而不是&#34;运算符&#34;柱

NEFL_TYPE   GRGR_ID     NEFL_KEY    NEFL_VALUE  NEFL_COLUMN   START    END
"PDRU"      "2600"      "PD"         "RV"        ">"           121    9999
"PDRU"      "2600"      "RV"         "PD"        "<="           0      120
--------------------------------------------------------------------------
INNER JOIN
    Table1
ON
    Table2.STATUS = Table1.NEFL_KEY
AND
    Table1.NEFL_TYPE = 'PDRU'
WHERE
    Table1.GRGR_ID = '2600'
AND
    ABS(DATEDIFF(dd, Table2.DUE_DT,GETDATE())) BETWEEN Table1.START AND Table1.END

但是没有一个像我想的那样干净或优雅