[英]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 case ; ms 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 WHEN ( Condition_1 AND Condition_2 OR ... Condition_N ) THEN (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.