【问题标题】:Data Conversion while creating table in MYSQL在MYSQL中创建表时的数据转换
【发布时间】:2019-12-31 04:31:29
【问题描述】:

创建表时出错,但 SQL 正在检索结果

请找到下面的代码,下面的 SQL 本身就可以很好地检索结果!

SELECT 
CASE WHEN J.JOBID = DJ.JOBNUMBER
     THEN DJ.JOBID ELSE J.JOBID 
                 END AS JOBID, 
J.DISTRICTID,   
CASE WHEN D.DISTRICTID = J.DISTRICTID 
     THEN D.NAME ELSE NULL 
                 END AS DISTRICT_NAME,
D.SEGMENTID,
CASE WHEN D.SEGMENTID = S.SEGMENTID AND D.DISTRICTID = J.DISTRICTID
     THEN S.NAME ELSE NULL 
                 END AS SEGMENT,
J.STARTTIME, 
J.ENDTIME, 
SJ.COMCATJOBTYPEID, 
J.JOBTYPEID,
CASE WHEN J.JOBTYPEID = JT.JOBTYPEID 
     THEN JT.NAME ELSE NULL 
                 END AS JOBTYPENAME,
TS.SSSEGMENT AS SUBPL_NAME,
CONCAT(D.DISTRICTID,TS.SSSEGMENT) AS DISTRICTSUBPLID
FROM `EAR-AA-242`.JOB J
LEFT JOIN `EAR-AA-242`.DISTRICT D ON J.DISTRICTID = D.DISTRICTID
LEFT JOIN `EAR-AA-242`.DMJOB DJ ON DJ.JOBNUMBER = J.JOBID 
LEFT JOIN `EAR-AA-242`.JOBTYPE JT ON JT.JOBTYPEID = J.JOBTYPEID
LEFT JOIN `EAR-AA-242`.STANDARDJOBTYPE SJ ON JT.STANDARDJOBTYPEID = SJ.STANDARDJOBTYPEID
LEFT JOIN `EAR-AA-239`.TBLJOBTYPE TJ ON SJ.COMCATJOBTYPEID = TJ.JOBTYPEID
LEFT JOIN (SELECT SS.SSSEGMENT, SS.NODEID FROM `EAR-AA-239`.TBLSSSEGMENT S, 
                    `EAR-AA-239`.TBLSSSEGMENT SS WHERE S.SSS = SS.PARENTSSS AND SS.DELETED = 0) TS ON TJ.SSSEGMENT =TS.NODEID                    
LEFT JOIN `EAR-AA-242`.SEGMENT S ON S.SEGMENTID = D.SEGMENTID
WHERE DATE(J.STARTTIME) > DATE_SUB(DATE(SYSDATE()), INTERVAL 367 DAY) 
ORDER BY J.JOBID;

相同的代码代码,在创建表时抛出一个 错误代码:1292。截断不正确的 DOUBLE 值:'11COC0011'

CREATE TABLE ODS.JOB_LOCATION_IDISTRICT AS

SELECT 
CASE WHEN J.JOBID = DJ.JOBNUMBER
     THEN DJ.JOBID ELSE J.JOBID 
                 END AS JOBID, 
J.DISTRICTID,   
CASE WHEN D.DISTRICTID = J.DISTRICTID 
     THEN D.NAME ELSE NULL 
                 END AS DISTRICT_NAME,
D.SEGMENTID,
CASE WHEN D.SEGMENTID = S.SEGMENTID AND D.DISTRICTID = J.DISTRICTID
     THEN S.NAME ELSE NULL 
                 END AS SEGMENT,
J.STARTTIME, 
J.ENDTIME, 
SJ.COMCATJOBTYPEID, 
J.JOBTYPEID,
CASE WHEN J.JOBTYPEID = JT.JOBTYPEID 
     THEN JT.NAME ELSE NULL 
                 END AS JOBTYPENAME,
TS.SSSEGMENT AS SUBPL_NAME,
CONCAT(D.DISTRICTID,TS.SSSEGMENT) AS DISTRICTSUBPLID
FROM `EAR-AA-242`.JOB J
LEFT JOIN `EAR-AA-242`.DISTRICT D ON J.DISTRICTID = D.DISTRICTID
LEFT JOIN `EAR-AA-242`.DMJOB DJ ON DJ.JOBNUMBER = J.JOBID 
LEFT JOIN `EAR-AA-242`.JOBTYPE JT ON JT.JOBTYPEID = J.JOBTYPEID
LEFT JOIN `EAR-AA-242`.STANDARDJOBTYPE SJ ON JT.STANDARDJOBTYPEID = SJ.STANDARDJOBTYPEID
LEFT JOIN `EAR-AA-239`.TBLJOBTYPE TJ ON SJ.COMCATJOBTYPEID = TJ.JOBTYPEID
LEFT JOIN (SELECT SS.SSSEGMENT, SS.NODEID FROM `EAR-AA-239`.TBLSSSEGMENT S, 
                    `EAR-AA-239`.TBLSSSEGMENT SS WHERE S.SSS = SS.PARENTSSS AND SS.DELETED = 0) TS ON TJ.SSSEGMENT =TS.NODEID                    
LEFT JOIN `EAR-AA-242`.SEGMENT S ON S.SEGMENTID = D.SEGMENTID
WHERE DATE(J.STARTTIME) > DATE_SUB(DATE(SYSDATE()), INTERVAL 367 DAY) 
ORDER BY J.JOBID;


非常感谢任何帮助!!!

【问题讨论】:

  • 如果你在 mysql-workbench 中运行你的选择查询,我猜实际上只有第一行被读取。但是当您使用CREATE TABLE 运行它时,会立即读取所有行然后抛出错误。如果您在工作台结果中向下滚动直到最后,您最终也应该抛出错误

标签: mysql mysql-workbench error-code


【解决方案1】:

您应该明确指定列的数据类型。没有它,MySQL 必须弄清楚类型是什么。当您使用CASE 表达式返回列的值时,它假定列数据类型将与第一个THEN 值的类型相同,但如果其他情况返回不同的值,这将是错误的类型。在您的代码中,您有一些 CASE 表达式,其中第一个结果是 DOUBLE,但另一个结果是无法转换为 DOUBLECHAR 字符串。

应该是这样的

CREATE TABLE ODS.JOB_LOCATION_IDISTRICT (
    JOBID VARCHAR(30),
    DISTRICTID INT,
    ...
) AS
SELECT 
...

【讨论】:

  • 我试过了,但还是一样的错误,不知道为什么 CREATE TABLE ODS.JOB_LOCATION_IDISTRICT ( JOBID varchar(100), DISTRICTID int(10), DISTRICT_NAME varchar(200), SEGMENTID int(10), SEGMENT varchar(200), STARTTIME datetime, ENDTIME datetime, COMCATJOBTYPEID int(10), JOBTYPEID int(10), JOBTYPENAME varchar(300), SUBPL_NAME varchar(200), DISTRICTSUBPLID varchar(300) ) 当 J.JOBID = DJ 时选择案例.JOBNUMBER THEN DJ.JOBID ELSE J.JOBID END AS JOBID, J.DISTRICTID,......
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 2014-09-15
  • 2013-10-01
  • 2021-01-05
  • 1970-01-01
  • 2014-12-31
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多