2016-08-03 155 views
2

我的例子是在这里:使用WHERE如果条件满足其他使用另一个WHERE

Select T1.*, 
     TC.country_name, 
     TS.state_name, 
     T1.address_type 
From mtpd2_virtuemart_order_userinfos T1 
    Left Join mtpd2_virtuemart_countries TC On TC.virtuemart_country_id = T1.virtuemart_country_id 
    Left Join mtpd2_virtuemart_states TS On TS.virtuemart_state_id = T1.virtuemart_state_id 
Where T1.address_type ='ST' OR T1.address_type = 'BT' 
     And T1.virtuemart_order_id /*SELECTED_ID_LIST*/ 

我要找的逻辑是使用(WHERE T1.address_type='ST')如果在细胞内的字符串是“ST”以其它方式使用(WHERE T1.address_type='BT')

enter image description here

+0

我删除了我不兼容的数据库标签。随意为您真正使用的数据库添加标签。我想你只是想''在':'在哪里T1.address_type IN('ST','BT')'。 –

+0

在一行包含'ST'的情况下,另一个'BT'选择'ST'行,但如果行中没有ST,请选择'BT'行,这是唯一的选择。 –

+0

我应该提到,我们一起有'BT'和'ST'的情况。这意味着我想,如果有2行一包含'ST'另一个'BT',那么只选择'ST'(其中T1.address_type ='ST')但如果我们只有一行,它是'BT',然后选择' BT' –

回答

0

只需使用括号和否定第二子句中的ST部分:

Select T1.*, 
    TC.country_name, 
    TS.state_name, 
    T1.address_type 
From mtpd2_virtuemart_order_userinfos T1 
    Left Join mtpd2_virtuemart_countries TC On TC.virtuemart_country_id = T1.virtuemart_country_id 
    Left Join mtpd2_virtuemart_states TS On TS.virtuemart_state_id =  T1.virtuemart_state_id 
Where 
    (T1.address_type ='ST' OR (T1.address_type <>'ST' && T1.address_type = 'BT')) 
And T1.virtuemart_order_id /*SELECTED_ID_LIST*/ 
+0

'ST'优先。但选择你使用的代码'英国' –

0

用圆括号围绕你的OR语句应该足以满足你的要求。

WHERE (T1.address_type ='ST' OR T1.address_type = 'BT') 
AND T1.virtuemart_order_id 
+0

没有尊重..在任何情况下带'BT'。我想IF'ST'不存在带来'BT' –

0

这可能是解决问题的一种方式,但我不知道这是否是最优化的方式: 1.创建只有address_type =“ST”作为TABLEA 2.创建另一个表只有address_type =“BT”和CUSTOMER_IDS不TableA中存在的表---说这表是tableB的 附加(串联/联盟)的两桌

这个代码可以达到目的:

select * from 
    (Select T1.*, 
      TC.country_name, 
      TS.state_name, 
      T1.address_type 
    From mtpd2_virtuemart_order_userinfos T1 
     Left Join mtpd2_virtuemart_countries TC On TC.virtuemart_country_id = T1.virtuemart_country_id 
     Left Join mtpd2_virtuemart_states TS On TS.virtuemart_state_id = T1.virtuemart_state_id 
    Where T1.address_type ='ST' 
      And T1.virtuemart_order_id /*SELECTED_ID_LIST*/) as A 
    Union 

select * from 
    (Select T1.*, 
      TC.country_name, 
      TS.state_name, 
      T1.address_type 
    From mtpd2_virtuemart_order_userinfos T1 
     Left Join mtpd2_virtuemart_countries TC On TC.virtuemart_country_id = T1.virtuemart_country_id 
     Left Join mtpd2_virtuemart_states TS On TS.virtuemart_state_id = T1.virtuemart_state_id 
    Where T1.address_type = 'BT' 
      And T1.virtuemart_order_id /*SELECTED_ID_LIST*/ 
      And TS.state_id not in (select TS.state_name 
            From mtpd2_virtuemart_order_userinfos T1 
            Left Join mtpd2_virtuemart_countries TC On       TC.virtuemart_country_id = T1.virtuemart_country_id 
     Left Join mtpd2_virtuemart_states TS On TS.virtuemart_state_id = T1.virtuemart_state_id 
    Where T1.address_type ='ST' 
      And T1.virtuemart_order_id /*SELECTED_ID_LIST*/)) as B 
+0

不幸的是创建表不是一个选项。我相信在SQL编码中有一个简单的方法来优先考虑语法的位置......我错了吗? –

+0

@alifath是的,也可能有其他方式,但我可以想到这一点。顺便说一句,在这种情况下,你也不需要创建单独的表,子查询可以满足要求。 – Ayushi

+0

它是一个用于fastreport 5.3报表设计器的sql查询。你的意思是查询使虚拟表或临时表变为临时表?我使用的代码和sql edtor说'语法'为'as'并不存在 –

相关问题