On Mon, 11 Apr 2005, Eamon Daly wrote:

>You were on the right track. Casting a string to a number
>results in a 0 if MySQL can't make a proper conversion,
>which is slightly counter-intuitive. This might suit your
>needs:

I see. Cheers.

Shame their is no 'IS_VALID_INT()' or 'IS_VALID_FLOAT()'.

:)

Dan.




>
>mysql> select * from mixed_num;
>+--------+
>| my_col |
>+--------+
>| a      |
>| 0      |
>| 1      |
>| abc123 |
>| 123abc |
>| 1.2    |
>| -1     |
>+--------+
>7 rows in set (0.12 sec)
>
>mysql> select my_col, my_col + 0 from mixed_num where my_col = '0' OR my_col 
>+ 0 != 0;
>+--------+------------+
>| my_col | my_col + 0 |
>+--------+------------+
>| 0      |          0 |
>| 1      |          1 |
>| 123abc |        123 |
>| 1.2    |        1.2 |
>| -1     |         -1 |
>+--------+------------+
>5 rows in set (0.00 sec)
>
>Note that '123abc' is changed to '123', which may make a big
>difference to you.
>
>A less magical way to get at these numbers is using REGEXP:
>
>Unsigned decimals:
>
>mysql> select my_col from mixed_num where my_col REGEXP '^[0-9.]+$';
>+--------+
>| my_col |
>+--------+
>| 0      |
>| 1      |
>| 1.2    |
>+--------+
>3 rows in set (0.00 sec)
>
>Unsigned integers:
>
>mysql> select my_col from mixed_num where my_col REGEXP '^[0-9]+$';
>+--------+
>| my_col |
>+--------+
>| 0      |
>| 1      |
>+--------+
>2 rows in set (0.00 sec)
>
>Signed integers:
>
>mysql> select my_col from mixed_num where my_col REGEXP '^-?[0-9]+$';
>+--------+
>| my_col |
>+--------+
>| 0      |
>| 1      |
>| -1     |
>+--------+
>3 rows in set (2.78 sec)
>
>...et cetera. REGEXP is explained here:
>
>http://dev.mysql.com/doc/mysql/en/regexp.html
>
>____________________________________________________________
>Eamon Daly
>
>
>
>----- Original Message ----- 
>From: "Dan Bolser" <[EMAIL PROTECTED]>
>To: <mysql@lists.mysql.com>
>Sent: Sunday, April 10, 2005 10:10 AM
>Subject: Find valid numeric values in a string field?
>
>
>>
>> I have a column like this "my_col varchar(20) null".
>>
>> The values in the column can be text or numbers. How can I select only
>> those rows where the value in this column is a valid number?
>>
>> I need something like IS_DECIMAL(), but I can't find that function.
>>
>> The following SQL fails to do the job (probably because of
>> optimization)...
>>
>> SELECT
>>  MIXED_COLUMN,
>>  MIXED_COLUMN + 0
>> FROM
>>  TABLE
>> WHERE
>>  MIXED_COLUMN =
>>  MIXED_COLUMN + 0
>> ;
>>
>> Hey, lets make an IS_DECIMAL UDF! ;)
>>
>> ----
>>
>> p.s. why aren't the addresses of these mailing lists anywhere to be found
>> on the MySQL Lists pages?
>>
>> Dan.
>>
>>
>> -- 
>> MySQL General Mailing List
>> For list archives: http://lists.mysql.com/mysql
>> To unsubscribe: 
>> http://lists.mysql.com/[EMAIL PROTECTED]
>> 
>


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to