char、varchar和varchar2的区别(zt)

char、varchar和varchar2的区别(zt)

区别:      1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。      2.CHAR的效率比VARCHAR2的效率稍高。      3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。 何时该用CHAR,何时该用varchar2?     CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.     VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。     VARCHAR2 虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

    char中还会自动补齐空格,因为你insert到一个char字段自动补充了空格的,但是select 后空格没有删除。

WITH /*******销售金额******/ T_XS AS( SELECT TO_CHAR(WADAT_IST,'YYYY') YEARS, TO_CHAR(WADAT_IST,'YYYYMM') MONTHS, CASE WHEN TO_CHAR(WADAT_IST,'YYYY')>= '2025' THEN kv.NAME_ORG4 ELSE zvj.NAME_ORG4 END AS NAME_ORG4, CASE WHEN TO_CHAR(WADAT_IST,'YYYY')>= '2025' THEN kv.vkbur ELSE zvj.VKBUR END VKBUR, CASE WHEN TO_CHAR(WADAT_IST,'YYYY') = TO_CHAR(SYSDATE, 'YYYY') AND TO_CHAR(WADAT_IST,'YYYYMM') = TO_CHAR(MAX(WADAT_IST) OVER (PARTITION BY TO_CHAR(WADAT_IST,'YYYY')), 'YYYYMM') THEN SUM(BWBJE) / EXTRACT(DAY FROM LAST_DAY(TO_DATE(WADAT_IST,'YYYYMMDD'))) * EXTRACT(DAY FROM LAST_DAY(TO_DATE(WADAT_IST,'YYYYMMDD'))) ELSE SUM(BWBJE) END AS BWBJE FROM Z_V_JHMX ZVJ LEFT JOIN z_v_knvv kv ON zvj.mandt = kv.mandt AND LTRIM(zvj.kunnr, 0) = kv.kunnr WHERE WADAT_IST BETWEEN TO_DATE('${I_YEARS}', 'YYYY') - INTERVAL '1' YEAR -- 上一年度第一天 AND LAST_DAY(TO_DATE('${I_YEARS}', 'YYYY')) -- 本年度最后一天 GROUP BY TO_CHAR(WADAT_IST,'YYYY'), TO_CHAR(WADAT_IST,'YYYYMM'), CASE WHEN TO_CHAR(WADAT_IST,'YYYY')>= '2025' THEN kv.NAME_ORG4 ELSE zvj.NAME_ORG4 END, CASE WHEN TO_CHAR(WADAT_IST,'YYYY')>= '2025' THEN kv.vkbur ELSE zvj.VKBUR END HAVING ROUND(SUM(BWBJE), 2) > 0), T_RW AS( /******月目标*********/ SELECT YEARS, YEARS || MONTHS MONTHS, TYPES, VKBUR, NAME_ORG4, ROUND(SALES_TASK, 2) AS SALES_TASK FROM CUST_USER_ROLE_ADMIN.ZT_CUSTORMERORG_TASK ZST WHERE ZST.TYPES = 'M' AND NULLIF(SALES_TASK,0)<> 0 /* ${if(isnull(VKBUR),"","AND VKBUR in ('" + REPLACE(VKBUR, ',', "'" + ',' + "'")+ "')")}*/ AND ZST.YEARS = '${I_YEARS}' ORDER BY NULLIF(SALES_TASK,0) ), Y_RW AS( /******年目标*******/ SELECT YEARS, TYPES, VKBUR, SUM(SALES_TASK) SALES_TASK, NAME_ORG4 FROM CUST_USER_ROLE_ADMIN.ZT_CUSTORMERORG_TASK WHERE TYPES = 'Y' AND YEARS = '${I_YEARS}' /*${if(isnull(VKBUR),"","AND VKBUR in ('" + REPLACE(VKBUR, ',', "'" + ',' + "'")+ "')")}*/ GROUP BY YEARS, TYPES, VKBUR, NAME_ORG4 ) SELECT PP.NAME_ORG4 || PP.VKBUR FZ , PP.YEARS, PP.MONTHS, PP.VKBUR, PP.NAME_ORG4, a.BWBJE, C.SALES_TASK AS Y_TASK , b.SALES_TASK, A_TQ.BWBJE AS TQBWBJE, a.BWBJE / CASE WHEN b.SALES_TASK = 0 THEN NULL ELSE b.SALES_TASK END wcl FROM( /********/ SELECT P2.vkbur, P2.NAME_ORG4, P2.YEARS, P2.YEARS || P3.MONTHS AS MONTHS FROM ( SELECT DISTINCT vkbur, NAME_ORG4, YEARS FROM( SELECT DISTINCT vkbur,NAME_ORG4,YEARS FROM T_RW UNION ALL SELECT DISTINCT vkbur,NAME_ORG4,YEARS FROM T_XS )P1 WHERE YEARS = '${I_YEARS}' )P2 CROSS JOIN ( -- 生成1到12的整数 SELECT RIGHT('0' || generated_period_start,2) AS MONTHS FROM SERIES_GENERATE_DECIMAL(1,1,13) )P3)PP /*****月任务****/ LEFT JOIN T_RW B ON PP.vkbur = B.vkbur AND PP.NAME_ORG4 = B.NAME_ORG4 AND PP.MONTHS = B.MONTHS AND PP.YEARS = B.YEARS /******交货金额*****/ LEFT JOIN T_XS A ON A.MONTHS = PP.MONTHS AND A.vkbur = PP.vkbur AND A.NAME_ORG4 = PP.NAME_ORG4 AND A.YEARS = PP.YEARS /******同期交货金额*******/ LEFT JOIN T_XS A_TQ ON TO_VARCHAR(ADD_YEARS(A_TQ.MONTHS, 1), 'YYYYMM') = PP.MONTHS AND A_TQ.vkbur = PP.vkbur AND A_TQ.NAME_ORG4 = PP.NAME_ORG4 AND (A_TQ.YEARS + 1)= PP.YEARS /*****年任务******/ LEFT JOIN Y_RW C ON PP.vkbur = C.vkbur AND PP.NAME_ORG4 = C.NAME_ORG4 ORDER BY --PP.MONTHS ASC, TO_INT(C.SALES_TASK) DESC, PP.MONTHS ASC, a.BWBJE desc 逻辑要求变更为同期销售金额计算截至到今天
最新发布
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值