前言
改了好多sql,认识了几个新的函数,总结一下。
问题
1.
sql拼接问题
示例:
${if(len(enddate)==0,"","and ( date_format(transport.DISCHARGE_DATE_START, '%Y-%m') ='"+enddate+"' or date_format(transport.DISCHARGE_DATE_END, '%Y-%m') ='"+enddate+"')")}
transport.DISCHARGE_DATE_START是日期时间类型;enddate的格式是”2018-03”
最开始enddate也做了date_format转换,怕界面上传过来的参数有变动,但是一直出错。
原因是:sql语句中可以用date_format函数,但是穿过来的参数不能使用这个函数,参数知识拼接进sql,没有语言执行它的转换函数。
解决方法:就是上面的,数据库中的字段做了日期格式转换,界面上的参数没有做
8.
exists
示例片段:
WHERE
br.ALIVE_FLAG = '1'
AND EXISTS (
SELECT
1
FROM
t_cms_info ci
WHERE
ci.ALIVE_FLAG = '1'
AND ci.ID = br.INFORMATION_ID
AND ci.EXTEND3 = 'month'
AND ci.EXTEND10 = 'zh'
)
exists的返回值true 或者 false, 扫面符合where条件的就exists就为true
9.
format
示例:
FORMAT(goods.QUANTITY, 0) AS "数量(桶)" 0位小数,整数
FORMAT(max(statement.SETTLEMENT_PRICE), 3) 3位小数
10.
dateformat
函数:
date_format(NOW(), '%Y%U') 当前时间是第几周
date_format(NOW(), '%Y%m%d') 年月日
date_format(NOW(), '%Y%m') 年月
示例:
${if(len(pstartdate)==0,"","and date_format(CREATE_DATE,'%Y-%m-%d') between'"+pstartdate+"'and '"+penddate +"'")}
between and 是可以去到区间边界的值的,但是CREATE_DATE是一个日期时间类型,pstartdate和penddate 都是日期类型,日期类型默认的时间都是0点,只要时间不是00:00:00都查不出区间的边界时间,所以统一了格式
11.
订单执行实例left join
示例:
SELECT
od.ORDER_NO AS "订单编号",
od.CREATE_DATE AS "订单时间",
od.BUYER_CUSTOMER_NAME AS "买方",
od.SELLER_CUSTOMER_NAME AS "卖方",
goods.EN_NAME AS "品种",
price.TRADE_TERM AS "贸易条款",
FORMAT(goods.QUANTITY, 0) AS "数量(桶)",
CONCAT(
'+/-',
FORMAT(goods.MORE_LESS, 0),
'%'
) AS "溢短装",
ship.`NAME` AS "船名",
group_concat(transport.LOADING_PORT) AS "装货港",
CONCAT(
transport.DELIVERY_DATE_START,
'至',
transport.DELIVERY_DATE_END
) AS "装期",
group_concat(transport.UPLOADING_PORT) AS "卸货港",
CONCAT(
transport.DISCHARGE_DATE_START,
'至',
transport.DISCHARGE_DATE_END
) AS "卸货期",
group_concat(loading.BL_DATE) AS "提单日",
group_concat(
FORMAT(loading.BL_NIGHTSTOOL, 0)
) AS "提单量",
group_concat(
FORMAT(unloading.POT_HAIR_BAR, 0)
) AS "卸货量",
group_concat(
FORMAT(
unloading.BL_HAIR_BAR_RATE,
0
)
) AS "(O-P)%",
CONCAT('$',IFNULL((select FORMAT(max(statement.SETTLEMENT_PRICE), 3) from t_order_statement statement where od.ID = statement.ORDER_ID and statement.STATEMENT_TYPE = '2' and statement.alive_flag = '1'),
(select FORMAT(max(statement.SETTLEMENT_PRICE), 3) from t_order_statement statement where od.ID = statement.ORDER_ID and statement.STATEMENT_TYPE = '1' and statement.alive_flag = '1'))) AS "结算价格",
CASE od.`STATUS`
WHEN '05' THEN
'已成交'
WHEN '10' THEN
'已租船'
WHEN '15' THEN
'已装船'
WHEN '20' THEN
'已到港'
WHEN '25' THEN
'已卸货'
WHEN '30' THEN
'已对账'
WHEN '35' THEN
'已收款'
WHEN '00' THEN
'已取消'
END AS "状态"
FROM
t_order od
LEFT JOIN t_order_goods goods ON od.ID = goods.ORDER_ID
LEFT JOIN t_order_price price ON od.ID = price.ORDER_ID
LEFT JOIN t_order_ship ship ON od.ID = ship.ORDER_ID
LEFT JOIN t_order_transport transport ON od.ID = transport.ORDER_ID
LEFT JOIN t_order_ship_loadinginfo loading ON od.ORDER_NO = loading.ORDER_NO
LEFT JOIN t_order_ship_unloadinginfo unloading ON od.ORDER_NO = unloading.ORDER_NO
WHERE
od.ALIVE_FLAG = '1'
AND goods.ALIVE_FLAG = '1'
AND IFNULL(price.ALIVE_FLAG, '1') = '1'
AND IFNULL(ship.ALIVE_FLAG, '1') = '1'
AND IFNULL(transport.ALIVE_FLAG, '1') = '1'
AND IFNULL(loading.ALIVE_FLAG, '1') = '1'
AND IFNULL(unloading.ALIVE_FLAG, '1') = '1'
${if(len(startdate)==0,"","and ( date_format(transport.DELIVERY_DATE_START, '%Y-%m') ='"+startdate+"' or date_format(transport.DELIVERY_DATE_END, '%Y-%m') ='"+startdate+"')")}
${if(len(enddate)==0,"","and ( date_format(transport.DISCHARGE_DATE_START, '%Y-%m') ='"+enddate+"' or date_format(transport.DISCHARGE_DATE_END, '%Y-%m') ='"+enddate+"')")}
${if(len(loadingPort)==0,"","and transport.LOADING_PORT ='"+loadingPort+"'")}
${if(len(unloadingPort)==0,"","and transport.UPLOADING_PORT ='"+unloadingPort+"'")}
${if(len(shipName)==0,"","and ship.`NAME` ='"+shipName+"'")}
${if(len(buyer)==0,"","and od.BUYER_CUSTOMER_NAME ='"+buyer+"'")}
${if(len(seller)==0,"","and od.SELLER_CUSTOMER_NAME ='"+seller+"'")}
${if(len(moreOrLess)==0,"","and group_concat(
FORMAT(
unloading.BL_HAIR_BAR_RATE,
0
)
) ='"+moreOrLess+"'")}
${if(len(state)==0,"","and od.`STATUS` ='"+state+"'")}
${if(len(tradeTerm)==0,"","and price.TRADE_TERM ='"+tradeTerm+"'")}
GROUP BY
od.ID;
12.
资讯实例 union
select name as "频道名称", monthBrowse as "本月浏览量"
from
(SELECT
cs.CHANNEL_NAME AS name,
(
SELECT
COUNT(br.ID)
FROM
t_cms_browsing_record br
WHERE
br.ALIVE_FLAG = '1'
AND EXISTS (
SELECT
1
FROM
t_cms_info ci
WHERE
ci.ALIVE_FLAG = '1'
AND ci.ID = br.INFORMATION_ID
AND ci.CHANNEL_ID = cs.ID
)
AND date_format(br.CREATE_DATE, '%Y%m') = date_format(NOW(), '%Y%m')
) AS monthBrowse
FROM
t_cms_channel_sub cs
WHERE
cs.ALIVE_FLAG = '1'
AND EXISTS (
SELECT
1
FROM
t_cms_channel_m cm
WHERE
cm.ALIVE_FLAG = '1'
AND cm.ID = cs.CHANNEL_M_ID
AND cm.CHANNEL_M_DESC = 'ZX'
)
UNION
SELECT
'山东专栏' AS name,
(
SELECT
COUNT(br.ID)
FROM
t_cms_browsing_record br
WHERE
br.ALIVE_FLAG = '1'
AND EXISTS (
SELECT
1
FROM
t_cms_info ci
WHERE
ci.ALIVE_FLAG = '1'
AND ci.ID = br.INFORMATION_ID
AND ci.CHANNEL_ID IN (
SELECT
cs.ID
FROM
t_cms_channel_sub cs
WHERE
cs.ALIVE_FLAG = '1'
AND EXISTS (
SELECT
1
FROM
t_cms_channel_m cm
WHERE
cm.ALIVE_FLAG = '1'
AND cm.ID = cs.CHANNEL_M_ID
AND cm.CHANNEL_M_DESC = 'SDZL'
)
)
)
AND date_format(br.CREATE_DATE, '%Y%m') = date_format(NOW(), '%Y%m')
) AS monthBrowse
FROM
DUAL
UNION
SELECT
'月度报告' AS name,
(
SELECT
COUNT(br.ID)
FROM
t_cms_browsing_record br
WHERE
br.ALIVE_FLAG = '1'
AND EXISTS (
SELECT
1
FROM
t_cms_info ci
WHERE
ci.ALIVE_FLAG = '1'
AND ci.ID = br.INFORMATION_ID
AND ci.EXTEND3 = 'month'
AND ci.EXTEND10 = 'zh'
)
AND date_format(br.CREATE_DATE, '%Y%m') = date_format(NOW(), '%Y%m')
) AS monthBrowse
FROM
DUAL)as oriInfo order by monthBrowse DESC
<font size = 3> 13.sql实例--嵌套条件
SELECT COUNT(*) FROM contract
WHERE buyer NOT IN (
SELECT member_id FROM `crude-trade-member`.enterprises
WHERE full_name LIKE '%中化%'
OR full_name LIKE '%SINOCHEM%'
)
AND seller NOT IN (
SELECT member_id FROM `crude-trade-member`.enterprises
WHERE full_name LIKE '%中化%'
OR full_name LIKE '%SINOCHEM%'
); -- 第三方交易(笔数)
“`
小结
有一个sql写的特别长,感觉有些不合理,执行起来会很慢 ,但是需求是这样的,目前我先写成了这样,还好并发不大。