0

文字列列が2つの数値の間にある場合、フィールドの値を更新しようとしています。

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNum,"26")
WHERE modNum NOT LIKE '%26%' 
  AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444);

残念ながら、エラーが発生します。

エラーコード:1292。切り捨てられた誤ったDOUBLE値: '4123F'

選択を行うと期待どおりの結果が得られるので、驚いています。

SELECT *
FROM SAMPLE.EXAMPLE 
WHERE modNum NOT LIKE '%26%' 
  AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444);

テーブルステートメントを作成します。

'CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `modNum` char(4) DEFAULT NULL,
  `procKey` char(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1'

サンプルデータ:

INSERT INTO `SAMPLE`.`EXAMPLE` (`modNum`, `procKey`) VALUES ('42', '99001');
INSERT INTO `SAMPLE`.`EXAMPLE` (`modNum`, `procKey`) VALUES ('42', '9900f');

条件を指定して列を更新するにはどうすればよいですか?



私にはそれはバグのように見えます。私が思いつくことができる最善の方法は、正規表現を使用してprocKeyの値が整数であるかどうかを確認することです。UPDATEステートメントを次のように変更しました。

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNum,"26") 
WHERE modNum NOT LIKE '%26%' 
    AND procKey REGEXP '^[0-9]+$' 
    AND (procKey BETWEEN 90000 AND 99123 
        OR procKey = 77444);

もっと良い方法があれば教えてください。

4

3 に答える 3

1

私にはそれはバグのように見えます。私が思いつくことができる最善の方法は、正規表現を使用してprocKeyの値が整数であるかどうかを確認することです。UPDATEステートメントを次のように変更しました。

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNum,"26") 
WHERE modNum NOT LIKE '%26%' 
    AND procKey REGEXP '^[0-9]+$' 
    AND (procKey BETWEEN 90000 AND 99123 
        OR procKey = 77444);

もっと良い方法があれば教えてください。

于 2012-06-26T12:29:17.093 に答える
0

これを試して:

UPDATE SAMPLE.EXAMPLE
SET modNum = CONCAT(modNUM,"26") 
WHERE modNum NOT LIKE '%26%' 
  AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444);
于 2012-06-25T15:44:02.583 に答える
0

それは私のために働くので、私はそれがいくつかのバグでなければならないことをかなり確信しています。

mysql> CREATE TABLE `example` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `modNum` char(4) DEFAULT NULL,
    ->   `procKey` char(8) DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
    -> ;
Query OK, 0 rows affected (0.04 sec)

mysql> UPDATE EXAMPLE                                                               
-> SET modNum = CONCAT(modNum,"26")
    -> WHERE modNum NOT LIKE '%26%' 
    ->   AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444);
ERROR 1146 (42S02): Table 'SOF.EXAMPLE' doesn't exist
mysql> UPDATE example 
    -> SET modNum = CONCAT(modNum,"26")
    -> WHERE modNum NOT LIKE '%26%' 
    ->   AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444);
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.9     |
+-----------+
1 row in set (0.00 sec)

編集:

mysql> INSERT INTO `example` (`modNum`, `procKey`) VALUES ('42', '99001');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `example` (`modNum`, `procKey`) VALUES ('42', '9900f');
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE example  SET modNum = CONCAT(modNum,"26") WHERE modNum NOT LIKE '%26%'    AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444);
Query OK, 0 rows affected, 2 warnings (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 2

mysql> show warnings;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '9900f   ' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '9900f   ' |
+---------+------+----------------------------------------------+
2 rows in set (0.00 sec)
于 2012-06-25T16:35:39.330 に答える