2017-03-09 1 views
6

MySQL 5.5.37을 사용하고 있습니다. 나는"올바르지 않은 INTEGER 값 잘림"경고를 제거하기 위해 MySQL 업데이트 문을 어떻게 다시 작성합니까?

update resource r 
    set grade_id = convert(substring_index(substring_index(
        r.description, 'Grade ', -1), ' ', 1), unsigned integer) 
    where r.description like '% Grade%' 
     and CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
        r.description, 'Grade ', -1), ' ' ,1),UNSIGNED) > 0; 

Query OK, 0 rows affected, 7 warnings (0.02 sec) 
Rows matched: 1333 Changed: 0 Warnings: 7 

mysql> show warnings; 
+---------+------+--------------------------------------------------+ 
| Level | Code | Message           | 
+---------+------+--------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
+---------+------+--------------------------------------------------+ 

내가 이해하지 못하는 것은 내가 다르게 값 중 어느 것도 일치를 업데이트되고 있지 주어진 내 쿼리를 다시 작성하는 방법입니다 ... 다음과 같습니다 내 업데이트 문에서 경고를 제거 할 것을 경고 에 대해 불평하고있다. 아래는 내가 업데이트되는 고유 한 값을 나열 내 쿼리 ...

mysql> select distinct substring_index(substring_index(
       r.description, 'Grade ', -1), ' ', 1) 
      from resource r 
      where r.description like '% Grade%' 
      and CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
       r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0; 
+-----------------------------------------------------------------------+ 
| substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) | 
+-----------------------------------------------------------------------+ 
| 7                  | 
| 8                  | 
| 11                 | 
| 9                  | 
| 12                 | 
| 10                 | 
| 6                  | 
+-----------------------------------------------------------------------+ 

어떻게 그것이 잘못된 정수를 잘라내는 tryihng없이 같은 값을 갱신 그래서 내 업데이트 문을 다시 할 무엇입니까?

+0

데이터 표시. – olegsv

+0

나는 벌써했다. 마지막 질의에서 "r.description과 같은 '% Grade %'와 CONVERT (SUBSTRING_INDEX (SUBSTRING_INDEX (r), r ',' .description, 'Grade', -1), '', 1), UNSIGNED)> 0; ". 내가 다른 쿼리를 실행하기를 원한다면, 내가 원하는 것을 말해줘. – Dave

+0

_raw_ 데이터가 무엇인지 그리고 _final_ 결과를 테이블 (업데이트 후)에서 원하는대로 표시 할 수 있습니까? –

답변

3

는 지금까지 내 지식의 관심사로 당신은 경고로 인해 WHERE 절 조건이

CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0 

과 같이 명확 인해 ''MyCo 값에 대한 잘못된 정수 값으로 잘린 경고 성명에서 언급 얻을.

| Level | Code | Message           | 
+---------+------+--------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo' 

resource 테이블의 description 열에서 값에 대한 특정 패턴을 가지고 있지 않았다 어떤을 나타냅니다. 두 번째 & 세 번째 행에 위의 코드에 나타낸 바와 같이

description 
Foo Grade 100 Bar 
Foo Grade 99 Grade 
Foo Grade 98 Grade MyCO 

아래

처럼 당신은 기록에서 여러 Grade 문자열을 가지고있다. 간접적으로 SUBSTRING_INDEX(SUBSTRING_INDEX(r.description, 'Grade ',-1),' ',1), 행에 영향을줍니다. 제 제안은 모든 레코드가 올바르게 삽입되었는지 확인하십시오. 모든 레코드가 제대로 삽입 된 경우 설명 열에 여러 패턴 유형이 포함되어 있는지 확인하십시오. 여러 패턴이 포함 된 경우 UNION을 사용하여이 쿼리를 다시 작성해야합니다. 하나의 패턴에 대한 단일 쿼리와 다른 패턴에 대한 다른 쿼리.

그리고 아래에서 업데이트 된 쿼리를 시도해보십시오.

update resource r 
    set grade_id = convert(substring_index(substring_index(
        r.description, 'Grade ', -1), ' ', 1), unsigned integer) 
    where r.description like '% Grade%' 
    and substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) REGEXP '[0-9]+'; 

이 설명이 도움이 되길 바랍니다.

+0

Hmm을 선택합니다. .. 귀하의 예는 [이 렉스 테스터 데모] (http://rextester.com/TVHN10678)와 매우 유사합니다. 우연의 일치일까요? –

+0

"고정"해야합니다 :'REGEXP '^ [0-9] + $'' –

1

resource.description 열의 어딘가에 경고 출력에 따라 '' 또는 MyCo이 있습니다. 숫자가 아닌 데이터가 convert 함수에 전달됩니다. 여기에서 경고가 발생합니다.

원시 데이터가 어떤 모양인지는 모르지만 아래 쿼리를 실행하면 resource.description이 올바른 형식이 아닌 행을 식별해야합니다.

select distinct substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) 
from resource r 
order by r.description 

쿼리에 EXPLAIN을 실행할 수도 있습니다. 이것은 당신에게 더 많은 통찰력을 줄 수 있습니다. MySQL의 내부 구조는 모르지만, 아마도 convert 함수는 where 절을 가지고 있음에도 불구하고 어떻게 든 모든 행을보고 있습니다.

2

경고 절은 SELECT 절이 아니기 때문에 WHERE 절이 표시됩니다. 무효 (비 수치) 값이 조건을 0

CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
      r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0 

retuns false 변환되기 때문에. 따라서이 행은 결과에 나타나지 않습니다. 당신이 행이 경고의 원인이되는보고 문을 선택에서 해당 조건을 제거

select distinct 
    substring_index(substring_index(
     r.description, 'Grade ', -1), ' ', 1), 
    CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
     r.description, 'Grade ',-1),' ',1),UNSIGNED), 
     r.description 
from resource r 
where r.description like '% Grade%'; 

예 : http://rextester.com/TVHN10678

내가 데이터를 알 수 없기 때문에, 내가 그것을 해결하는 데 도움이되지 수 있습니다.

2

변환하기 전에 변형 된 공백을 제거하기 위해 trim()을 사용할 수 있습니까? 사람들은이 경고에 대해서도 이유입니다

당신은 정규 표현식을 사용하려고 할 수
2

, 뭔가 같은 :

곳에 '% 1 학년 %' 및 SUBSTRING_INDEX (SUBSTRING_INDEX ( r.description 같은 r.description, 'Grade', -1), '', 1) REGEXP '^ [0-9] + $'; 당신이 회색 영역에 스테핑 두려워하지 않는다 또는 경우

: 당신은 또한 모든 CONVERT없이 동일한 쿼리를 시도 할 수 있습니다 - 놀랍게도 그것은 단지 작동 할 수 있습니다

곳 r.description '% 1 학년처럼 % ' 및 SUBSTRING_INDEX (SUBSTRING_INDEX ( r.description,'Grade ', -1),' ', 1)> 0;

(다시 말하지만, '회색 영역'과 같이 문서화 된 동작인지 확실하지 않습니다.)

관련 문제