2015-07-21 25 views
-1

我有一個表的列有一個表達式作爲它的值。 我想編寫一個單選查詢來檢查該列中的表達式是否爲真。選擇列的表達式值有效的行

這裏是我的表:

CREATE TABLE #TEMP (FinYear VARCHAR(9), TaxType VARCHAR(50), Rate NUMERIC(10,4), SlabExpression VARCHAR(50)) 
INSERT INTO #TEMP 
VALUES ('2014-2015', 'SURCHARGE', 0.00, '#<=10000000'), 
     ('2014-2015', 'SURCHARGE', 10.00, '#>10000000'), 
     ('2014-2015', 'Education Cess', 3.00, '#<=10000000'), 
     ('2014-2015', 'Education Cess', 3.00, '#>10000000') 

SELECT * FROM #TEMP 
DROP TABLE #TEMP 

我的收入值現在爲120萬過板坯下明顯屬於 - 「#>千萬」上,我打算申請附加費和教育稅率。

但是,如何找到具有單個查詢的正確平板。

我知道我可以使用光標做到這一點。但是,我不想在這裏使用光標。 我需要一個單一查詢。

注意:此表在一列中有兩個SlabExpression值
即。 '#< = 10000000'AND'#> 10000000'

我想編寫一個SELECT查詢來獲得SlabExpression保持爲真的兩行。
即。我想要的結果爲兩排,SlabExpression「#>千萬」

基本上,我想查詢像

SELECT * FROM #TEMP WHERE SlabExpression Holds True 
+0

SELECT * FROM #TEMP其中SlabExpression像'1200000> 10000000' –

+0

只是爲了看看我是否得到它,您希望您的查詢評估SlabExpression列的內容並返回結果爲true的行嗎? –

+0

是@ZoharPeled。你做對了。我想評估SlabExpression列是否返回true。所以我會得到我的板坯。 –

回答

-1

我覺得這些SQL對你有用。

SELECT * FROM #TEMP WHERE SlabExpression = '1200000>10000000' 

謝謝。

+0

感謝您的回覆。但我的金額是可變的。所以我想要一個查詢,它將返回結果,它會告訴我在什麼板塊我的金額跌落。 –

+0

你說明是不夠的。你能否詳細說明你的問題。 –

+0

我在這裏重新組織了我的問題。 –

0
SELECT *, 
    CASE SUBSTRING(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression), PATINDEX('%[0-9]%', RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression)))) 
     WHEN '<=' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) <= CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) THEN 'True' 
      ELSE 'False' END 
     WHEN '=<' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) <= CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) THEN 'True' 
      ELSE 'False' END 
     WHEN '>=' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) >= CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) THEN 'True' 
      ELSE 'False' END 
     WHEN '=>' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) >= CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) THEN 'True' 
      ELSE 'False' END 
     WHEN '>' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) > CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression)) AS INT) THEN 'True' 
      ELSE 'False' END 
     WHEN '<' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) < CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression)) AS INT) THEN 'True' 
      ELSE 'False' END 
     WHEN '=' THEN 
      CASE WHEN CAST(LEFT(SlabExpression, PATINDEX('%[<,=,>]%', SlabExpression) -1) AS INT) = CAST(RIGHT(SlabExpression, LEN(SlabExpression) - PATINDEX('%[<,=,>]%', SlabExpression)) AS INT) THEN 'True' 
      ELSE 'False' END 
     ELSE null 
     END AS Value 
FROM #TEMP 
0

以下是解決此問題的一種方法。
在Sql server 2012上測試和驗證,出於某種原因,我似乎無法使它在sql小提琴上工作。 然而,最好的我所知,我沒有使用不支持SQL SERVER 2008年

DECLARE @Value int = 1200000 

;WITH CTE AS (
    SELECT FinYear, 
      TaxType, 
      Rate, 
      SlabExpression, 
      @Value As Value1, 
      REPLACE(LEFT(SlabExpression, PATINDEX('%[0-9]%', SlabExpression)-1), '#', '') As Operator, 
      CAST(RIGHT(SlabExpression, LEN(SlabExpression)-PATINDEX('%[0-9]%', SlabExpression)+1) As int) As Value2 
    FROM #TEMP 
), 
CTE2 AS (
    SELECT FinYear, 
      TaxType, 
      Rate, 
      SlabExpression, 
      CASE Operator 
       WHEN '<' THEN 
        CASE WHEN Value1 < Value2 THEN 1 END 
       WHEN '<=' THEN 
        CASE WHEN Value1 <= Value2 THEN 1 END 
       WHEN '>' THEN 
        CASE WHEN Value1 > Value2 THEN 1 END 
       WHEN '>=' THEN 
        CASE WHEN Value1 >= Value2 THEN 1 END 
      END As IsTrue 
    FROM CTE 
) 

SELECT FinYear, 
     TaxType, 
     Rate, 
     SlabExpression 
FROM CTE2 
WHERE IsTrue = 1 

結果什麼:

FinYear  TaxType    Rate   SlabExpression 
----------- ---------------------- -------------- -------------- 
2014-2015 SURCHARGE    0.0000   #<=10000000 
2014-2015 Education Cess   3.0000   #<=10000000 

說明: 我用第一cte將SlabExpression分解爲運算符和值, 和第二個cte將該運算符和值用於變量值。