简体   繁体   English

使用联接表中的if条件确定列数据

[英]Determine column data with if condition in a joined tables SQL

I have a query that works well, where i would like an assistance is how to incorporate a condition to determine the value displayed on a given column. 我有一个运行良好的查询,在这里我想寻求帮助的是如何合并条件以确定在给定列上显示的值。 That is if a column of a table has a value say "Authorization of COA" then the column date added should show the date else the column should show null 也就是说,如果表的某个列具有“ COA授权”的值,则添加的列日期应显示日期,否则该列应显示null

Here is my query so far 到目前为止,这是我的查询

SELECT r.request_id, r.product_name, r.created_at, r.can,a_s.stat, r.client_id, CONCAT(u.fname,' ',u.lname) 'analyst' , t.date_added (//should show the value of date_added else NULL based on a condition for this column),
    FROM request r
    LEFT OUTER JOIN assigned_samples a_s ON r.request_id = a_s.labref
    LEFT OUTER JOIN user u ON a_s.analyst_id = u.id
    LEFT OUTER JOIN tracking_table t ON r.request_id = t.labref
    WHERE r.client_id='$cid'
    AND r.created_at BETWEEN '$start' AND '$end'
    AND a_s.department_id = '$dept'
    GROUP BY r.request_id
    ORDER BY `r`.`created_at` DESC "

A simple CASE statement should be sufficient in this case, I believe. 我认为,在这种情况下,简单的CASE语句就足够了。

SELECT r.request_id, r.product_name, r.created_at, r.can,a_s.stat, r.client_id, 
CONCAT(u.fname,' ',u.lname) 'analyst', 
CASE WHEN ConditionColumn = 'Authorization of COA' THEN t.date_added 
ELSE NULL END AS 'date_added' 
    FROM request r
    LEFT OUTER JOIN assigned_samples a_s ON r.request_id = a_s.labref
    LEFT OUTER JOIN user u ON a_s.analyst_id = u.id
    LEFT OUTER JOIN tracking_table t ON r.request_id = t.labref
    WHERE r.client_id='$cid'

Give this a try: 试试看:

SELECT r.request_id, r.product_name, r.created_at, r.can,a_s.stat, r.client_id, CONCAT(u.fname,' ',u.lname) 'analyst' , 
IFF(nameOfColumnToTest = 'Authorization of COA', t.date_added, null) AS DateAdded 
    FROM request r
    LEFT OUTER JOIN assigned_samples a_s ON r.request_id = a_s.labref
    LEFT OUTER JOIN user u ON a_s.analyst_id = u.id
    LEFT OUTER JOIN tracking_table t ON r.request_id = t.labref
    WHERE r.client_id='$cid'
    AND r.created_at BETWEEN '$start' AND '$end'
    AND a_s.department_id = '$dept'
    GROUP BY r.request_id
    ORDER BY `r`.`created_at` DESC "

In both mysql and ms sql you can use case expression ( mysql case ; ms sql case ) to assign value to a field conditionally: 在mysql和ms sql中,都可以使用case表达式( mysql casems sql case )来有条件地将值分配给字段:

SELECT r.request_id, r.product_name, r.created_at, r.can,a_s.stat, r.client_id, CONCAT(u.fname,' ',u.lname) 'analyst' , 
    CASE WHEN Column_To_Test = 'Authorization of COA' THEN t.date_added
        ELSE null
    END AS date_added 
    FROM request r
    LEFT OUTER JOIN assigned_samples a_s ON r.request_id = a_s.labref
    LEFT OUTER JOIN user u ON a_s.analyst_id = u.id
    LEFT OUTER JOIN tracking_table t ON r.request_id = t.labref
    WHERE r.client_id='$cid'
    AND r.created_at BETWEEN '$start' AND '$end'
    AND a_s.department_id = '$dept'
    GROUP BY r.request_id
    ORDER BY `r`.`created_at` DESC "

This way the solution is more portable between the databases. 这样,解决方案在数据库之间更加可移植。 Mysql offers if() function, ms sql iif() to achieve the above, but those are product specific solutions. Mysql提供了if()函数和ms sql iif()来实现上述目的,但是这些是特定于产品的解决方案。

Try to use the Case statements like. 尝试使用Case语句之类的。

CASE WHEN ( Condition_1 AND Condition_2 OR ... Condition_N ) THEN (Value_1) ELSE (Value_1) END CASE WHENCondition_1 AND Condition_2 OR ... Condition_NTHEN (Value_1) ELSE (Value_1) END

Here Condition _1 can be column record value and its combination of Column record values and Value _1 can be single value [Ex: Null or "some string"] or Returned value from nested sql statement like [Ex: (select count(*) from ...)] 这里的条件 _1可以是列记录值,并且其列记录值和 _1的组合可以是单个值[Ex:Null或“ some string”]或嵌套sql语句返回的值,例如[Ex:(select count(*)from ...)]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM