1

たとえば、この種のデータを使用して、可変と呼ばれるテーブルのようなものがある場合:

IDサイズ
1100ml
2 30ml
3 6,7g
4 8,8kg
5アルファ110v
6ベータ220v

文字列の数値を抽出して浮動小数点数に変換するにはどうすればよいですか。(この場合、,小数部と整数部を分離します。

だから、どうすればこのようなものを返すためにクエリを実行できますか?:

IDサイズfinalSize
3 6,7g 6,7
4 8,8kg 8,8
2 30ml 30
1 100ml 100
5アルファ110v110
6ベータ220v220

この?(IDだけ):

id
3
4
2
1
5
6

PS:MySQL関数でこれを行う必要があります...

PS:2 MySQLを使用して正規表現の一致について検索しようとしましたが、一致したパターンを返す関数がないようです。数字ではないものや問題を解決できるものをすべて置き換える関数を作成したとしても、,これを行う方法が見つかりませんでした。MYSQLREPLACE関数は正規表現を使用しません。

4

4 に答える 4

4

関数に基づく解決策は次のとおりです。関数は、投稿の1つですぐに利用できました。だから私はcommaそれがうまくいくのでリストに追加することだけを変更しました:)

クエリ:

select id, size,
  replace(STRIP_NON_DIGIT(size),',','.')
  as final
from demo
;

働き:

CREATE FUNCTION STRIP_NON_DIGIT(input VARCHAR(255))
   RETURNS VARCHAR(255)
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      SET iterator = iterator + 1;
   END WHILE;   
   RETURN output;
END//

結果:

| ID |      SIZE | FINAL |
--------------------------
|  3 |      6,7g |   6.7 |
|  4 |     8,8kg |   8.8 |
|  2 |      30ml |    30 |
|  1 |     100ml |   100 |
|  5 | alfa 110v |   110 |
|  6 | beta 220v |   220 |

regex_replaceあなたがあなた自身に言ったように、MYSQLにはそのようなものがありませんOracle。複数の数を使用したい場合replaces(いくつと仮定したくない場合)を除いて、関数は便利です。

于 2013-01-18T17:08:10.763 に答える
1

これを試して

     SELECT size,
     @num := CONVERT(size, SIGNED) AS num_part,
     SUBSTRING(size, LENGTH(@num) + 1) AS rest_of_string 
     FROM your_table;
于 2013-01-18T16:51:25.680 に答える
0

素晴らしい機能bonCodigo!!!ですが、作業を簡素化するためにこの変更を報告したいと思います。

DELIMITER $$
DROP FUNCTION IF EXISTS `EXTRACT_NUMBER`$$

DELIMITER $$
CREATE FUNCTION EXTRACT_NUMBER(input VARCHAR(255))
   RETURNS VARCHAR(255)
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      SET iterator = iterator + 1;
   END WHILE;   
   RETURN CONVERT(replace(output,',','.'), DECIMAL) ;
END $$
于 2015-10-28T10:03:04.980 に答える
0

また、文字列に複数の数値が含まれている場合は、1つの数値のみを抽出するように再度変更しました。文字列が事前に異なる文字が存在する場合は、EXTRACT_NUMBER(SUBSTRING_INDEX(Notas、'CHARS'、-1))をCHARSにして関数を呼び出すことができます。

DELIMITER $$
DROP FUNCTION IF EXISTS `EXTRACT_NUMBER`$$

DELIMITER $$
CREATE FUNCTION EXTRACT_NUMBER(input VARCHAR(255))
   RETURNS VARCHAR(255)
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
        IF (SUBSTRING(input, iterator, 1) = ',' AND output = '') 
                THEN SET output = ''; 
            END IF;
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      IF (SUBSTRING(input, iterator, 1) NOT IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) AND output <> '') 
            THEN SET iterator = LENGTH(input);
      END IF;
      SET iterator = iterator + 1;
   END WHILE;
   RETURN replace(output,',','.');
END $$
于 2015-10-28T11:58:03.887 に答える