2013-07-13 27 views
0

我有一個查詢使用決策表根據多個條件進行決策。在決策表中實現規則的補充SQL

假設這裏我需要知道一個結果(是或否),具體取決於一個人擁有的屬性如表所示。

DROP TABLE IF EXISTS `tbl_decision`; 
CREATE TABLE `tbl_decision` (
    id_rule  INT NOT NULL primary key AUTO_INCREMENT, 
    rule_name  VARCHAR(25) NOT NULL, 
    minVal  INT NOT NULL, 
    maxVal  INT NOT NULL,  
    decision  CHAR(1) NOT NULL, 
    CONSTRAINT `uc_decision` UNIQUE (`id_rule`)   
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

Insert into `tbl_decision` VALUES 
(1, 'WEIGHT'  , 60 ,100 ,'Y'), 
(2, 'HEIGHT'  , 0 ,170 ,'Y'), 
(3, 'Special rate', 10 ,30 ,'Y'), 
(4, 'Consumption' , 0 ,3300,'N'); 

這裏是我比較表:

DROP TABLE IF EXISTS `tbl_guy`; 
CREATE TABLE `tbl_guy` (
    id_guy INT NOT NULL primary key AUTO_INCREMENT, 
    guy_name  VARCHAR(25) NOT NULL, 
    weight  INT NOT NULL, 
    height  INT NOT NULL,  
    rate   INT NOT NULL,  
    consumption INT NOT NULL,  
    CONSTRAINT `uc_guy` UNIQUE (`id_guy`)   
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 


Insert into `tbl_guy` VALUES 
(1, 'John'  , 200,220,10,1000), 
(2, 'Mary'  , 100,160,11,5100), 
(3, 'Diana'  , 80 ,155,19,4000), 
(4, 'Ruthanne' , 82 ,165, 5,2000); 

的決定,確定由下面的查詢。

SELECT * FROM 
(
SELECT id_guy,decision, 
CASE WHEN rule_name = 'WEIGHT'  THEN tbl_guy.weight 
    WHEN rule_name = 'HEIGHT'  THEN tbl_guy.height 
    WHEN rule_name = 'Special rate' THEN tbl_guy.rate 
    WHEN rule_name = 'Consumption' THEN tbl_guy.consumption 
END AS testQnty, rule_name, minVal, maxVal 
FROM tbl_guy CROSS JOIN tbl_decision 
) t 
WHERE minVal <= testQnty AND testQnty < maxVal 
ORDER BY id_guy; 

我使用最小值和最大值來判斷是否是,但是我不知道如何定義相反的規則。例如我定義:

(3, '特別率',10,30, 'Y')

是肯定的,如果在字段率人值是10 30之間和

但場消費,如果它在0和3300之間決定是否

(4,'消費',0,3300,'N');

我知道你可以使用這樣 如果0 <= x <= 3300補充將成爲x < 0 AND x > 3300 總是相反的規則,但如何啓用上查詢?

Here is my fiddle

other

回答

2

你的變量decision似乎體現兩個概念。一個是規則的方向(是「之間」還是「不在之間」),另一個是規則是否通過。爲了澄清的事情,下面保留了所有的規則,一個新的變量一起確定規則通過:

SELECT t.*, 
     (case when decision = 'Y' and minVal <= testQnty AND testQnty < maxVal 
      then 'Passed' 
      when decision = 'N' and not (minVal <= testQnty AND testQnty < maxVal) 
      then 'Passed' 
      else 'Not Passed' 
     end) as RuleResult 
FROM (SELECT id_guy, decision, 
      (CASE WHEN rule_name = 'WEIGHT'  THEN tbl_guy.weight 
        WHEN rule_name = 'HEIGHT'  THEN tbl_guy.height 
        WHEN rule_name = 'Special rate' THEN tbl_guy.rate 
        WHEN rule_name = 'Consumption' THEN tbl_guy.consumption 
       END) AS testQnty, rule_name, minVal, maxVal 
     FROM tbl_guy CROSS JOIN tbl_decision 
    ) t 
ORDER BY id_guy; 

如果你想只有通過規則:

SELECT t.* 
FROM (SELECT id_guy, decision, 
      (CASE WHEN rule_name = 'WEIGHT'  THEN tbl_guy.weight 
        WHEN rule_name = 'HEIGHT'  THEN tbl_guy.height 
        WHEN rule_name = 'Special rate' THEN tbl_guy.rate 
        WHEN rule_name = 'Consumption' THEN tbl_guy.consumption 
       END) AS testQnty, rule_name, minVal, maxVal 
     FROM tbl_guy CROSS JOIN tbl_decision 
    ) t 
where (decision = 'Y' and minVal <= testQnty AND testQnty < maxVal) or 
     (decision = 'N' and not (minVal <= testQnty AND testQnty < maxVal)) 
ORDER BY id_guy;