#[macro_export]
macro_rules! myupdatemany {
($t:expr, $i:expr, $v: expr) => {{
let i_info = $i.clone();
let i_vec: Vec<String> = i_info
.split(",")
.into_iter()
.map(|info| info.to_string())
.collect();
let mut incr_field: Vec<String> = vec![];
let mut query_field: Vec<String> = vec![];
for m in 0..i_vec.len() {
if i_vec[m].contains("+") {
incr_field.push(i_vec[m].clone())
} else {
query_field.push(i_vec[m].clone())
}
}
let i_data = query_field.join(",");
let table_upmj = $t.clone().to_owned() + "_upmj";
let table = $t.clone().to_owned();
let mut field_equl: Vec<String> = vec![];
let mut select_vec: Vec<String> = vec![];
for i in 0..$v.len() {
let item_str = $crate::to_string(&$v[i]).unwrap();
let o: $crate::Value = $crate::from_str(&item_str).unwrap();
let mut field_list: Vec<&str> = vec![];
let mut select_item: Vec<String> = vec![];
for key in o.as_object().unwrap().keys() {
if i == 0 {
field_list.push(&key);
}
let temp_v = &o[key];
if (temp_v.is_number()) {
select_item.push(temp_v.to_string() + " AS " + &key);
} else if temp_v.is_null() {
select_item.push("NULL".to_owned() + " AS " + &key);
} else if temp_v.is_string() {
let t_v = temp_v.as_str().unwrap();
if t_v == "null" {
select_item.push("\"null\"".to_owned() + " AS " + &key);
} else {
let mut v_r = t_v.to_string().as_str().replace("\\", "\\\\");
v_r = v_r.replace("\"", "\\\"");
select_item.push("\"".to_string() + &v_r + "\"" + " AS " + &key);
}
}
}
select_vec.push("SELECT ".to_string() + select_item.join(",").as_str());
if i == 0 {
field_equl = field_list
.iter()
.map(|x| {
let mut is_incr = false;
for c in 0..incr_field.len() {
if incr_field[c].contains(x) {
is_incr = true;
break;
}
}
let field = table.clone() + "." + x;
let field_upmj = table_upmj.clone() + "." + x;
if is_incr {
field.clone()
+ " = CASE WHEN "
+ &field_upmj
+ " IS NULL THEN "
+ &field
+ " WHEN CAST("
+ &field_upmj
+ " AS CHAR) = 'null' THEN NULL "
+ " ELSE "
+ &field
+ " + "
+ &field_upmj
+ " END"
} else {
field.clone()
+ " = CASE WHEN "
+ &field_upmj
+ " IS NULL THEN "
+ &field
+ " WHEN CAST("
+ &field_upmj
+ " AS CHAR) = 'null' THEN NULL "
+ " ELSE "
+ &field_upmj
+ " END"
}
})
.collect();
}
}
let sql: String = "UPDATE ".to_string()
+ $t
+ " JOIN( "
+ select_vec.join(" UNION ").as_str()
+ " ) AS "
+ table_upmj.as_str()
+ " USING("
+ i_data.as_str()
+ ") SET "
+ field_equl.join(", ").as_str();
sql
}};
}