how to trim leading zeros from alphanumeric text in mysql function - mysql

What mysql functions are there (if any) to trim leading zeros from an alphanumeric text field?
Field with value "00345ABC" would need to return "345ABC".

You are looking for the trim() function.
Alright, here is your example
SELECT TRIM(LEADING '0' FROM myfield) FROM table

TIP:
If your values are purely numerical, you can also use simple casting, e.g.
SELECT * FROM my_table WHERE accountid = '00322994' * 1
will actually convert into
SELECT * FROM my_table WHERE accountid = 322994
which is sufficient solution in many cases and also I believe is performance more effective. (warning - value type changes from STRING to INT/FLOAT).
In some situations, using some casting function might be also a way to go:
http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

If you want to update one entire column of a table, you can use
USE database_name;
UPDATE `table_name` SET `field` = TRIM(LEADING '0' FROM `field`) WHERE `field` LIKE '0%';

I believe you'd be best off with this:
SELECT TRIM(LEADING '0' FROM myField)

SELECT TRIM(LEADING '0' FROM *columnName*) FROM *tableName* ;
This also work correctly

just remove space between TRIM ( LEADING
use
SELECT * FROM my_table WHERE TRIM(LEADING '0' FROM accountid ) = '00322994'

simply perfect:
SELECT TRIM(LEADING '0' FROM myfield) FROM table

TRIM will allow you to remove the trailing, leading or all characters. Some examples on the use of the TRIM function in MySQL:
select trim(myfield) from (select ' test' myfield) t;
>> 'test'
select trim('0' from myfield) from (select '000000123000' myfield) t;
>> '123'
select trim(both '0' from myfield) from (select '000000123000' myfield) t;
>> '123'
select trim(leading '0' from myfield) from (select '000000123000' myfield) t;
>> '123000'
select trim(trailing '0' from myfield) from (select '000000123000' myfield) t;
>> '000000123'
If you want to remove only a select amount of leading/trailing characters, look into the LEFT/RIGHT functions, with combination of the LEN and INSTR functions

Related

mariadb Regexp sometime return empty in stored procedure

need help, i got trouble for few day.
the problem is regexp from subquery run on stored procedure, sometime return empty sometime correct.
REGEXP
(
select group_concat(_data_grupkasbank_auth.datahirarki separator '|') from _data_grupkasbank_auth where _data_grupkasbank_auth.uid='1'
)
if i replace subquery with string value, its always correct :
REGEXP
(
'/Sangatta/K3PC/|/Yayasan Balikpapan/Masjid/'
)
here my dbfiddle run work perfectly, but not on direct myserver windows 10, mariadb 10.3.23
https://www.db-fiddle.com/f/pRWvdP3KUwv7rbTN7H7PZC/0
capture :
result test
subquery
direct string
(from Comment)
select group_concat(_data_grupkasbank_view.kode_grupkasbank separator ',' )
from _data_grupkasbank_view
where _data_grupkasbank_view.hirarki_grupkasbank REGEXP
( SELECT group_concat(_data_grupkasbank_auth.datahirarki separator '|')
from _data_grupkasbank_auth
where _data_grupkasbank_auth.uid='1'
)
INTO v_tempsql
i dont know, but this work, i use this to assign SET v_temp2=v_temp1;
-- //////////
DECLARE v_temp1 TEXT;
DECLARE v_temp2 TEXT;
select
group_concat(yourfield separator '|')
INTO
v_temp1
from
table;
SET v_temp2 = v_temp1;
select
field1, field2
from table
where
field1 regexp v_temp2;
-- ///////////

How to remove one character from left and one character from right in MySQL

I have Timezone column and it gives time zone from country.I want remove parenthesis from string how it possible with sql
String is like
(GMT)
and I want
GMT
Can any body give me idea?
If you want remove the leading and trailing parenthesis in SELECT statement
SELECT
Using SUBSTR :
SET #str := '(GMT)';
SELECT
SUBSTR(#str FROM 2 FOR LENGTH(#str) - 2);
OR
Using REPLACE:
SET #str := '(GMT)';
SELECT
REPLACE(REPLACE(#str,')',''),'(','');
OR:
Using TRIM:
SET #str := '(GMT)';
SELECT
TRIM(TRAILING ')' FROM TRIM(LEADING '(' FROM #str));
Note: You have to put your table name while using SELECT. Like this:
SELECT
TRIM(TRAILING ')' FROM TRIM(LEADING '(' FROM YOUR_COLUMN NAME)) FROM YOUR_TABLE;
SQL FIDDLE DEMO
UPDATE
In case you want to update the corresponding columns in your table:
Using SUBSTR:
UPDATE
YOUR_TABLE
SET YOUR_COLUMN = SUBSTR(YOUR_COLUMN FROM 2 FOR LENGTH(YOUR_COLUMN) - 2);
Using REPLACE:
UPDATE
YOUR_TABLE
SET YOUR_COLUMN = REPLACE(REPLACE(YOUR_COLUMN,')',''),'(','');
Using TRIM:
UPDATE
YOUR_TABLE
SET YOUR_COLUMN = TRIM(TRAILING ')' FROM TRIM(LEADING '(' FROM YOUR_COLUMN));
Check the Link
$timezone = '(GMT)';
SELECT TRIM(LEADING '(' FROM '$timezone') AND TRIM(TRAILING ')' FROM '$timezone')

Format values on entire column SQL

I have a column which has values of format "01-01-2012" and I need to change it to "01.01.2012". I have to do the same for all the entries of that coloumn.
Could you please suggest a way to do it? I need a general SQL statement.
Thanks
Try this using REPLACE:
update tablename set column_name=REPLACE(column_name,'-','.')
One way to do this would be to use a basic UPDATE statement. In this case, you would update your entire table and for each row, set the value of the column to the formatted value. The basic outline would be like so:
UPDATE [TableName]
SET [ColumnName] = [FormattingExpression]
An example of [FormattingExpression] could be:
REPLACE ([ColumnName], '-' , '.' )
This would replace all instances of '-' with '.' for the values in the [ColumnName] column of your [TableName] table.
WITH TEST_DATA AS (
SELECT '12-12-2012' AS mydate FROM DUAL UNION ALL
SELECT '07-23-2013' FROM DUAL
)SELECT REPLACE(mydate, '-', '.') mynewdate
FROM TEST_DATA
Just replaced the - with .
REPLACE ( '01-01-2012' , '-' , '.' )
Try str_to_date
UPDATE `table` SET `date_col` = str_to_date(`date_col`,'%d.%m.%Y')
STR_TO_DATE(str,format)
update table_name set column_name = replace (column_name , '-' , '.' );

How do I remove all spaces from a field in a mysql database in an update query?

What would be the proper syntax used to run an update query on a table to remove all spaces from the values in a column?
I have a user table that had user names with spaces imported into it & I need to remove the spaces. i.e. "john smith sr." needs to be "johnsmithsr."
there are about 500+ occurrences.
You could try something like this:
UPDATE `table` SET `column` = REPLACE( `column` , ' ' , '' )
UPDATE <table>
SET name = REPLACE(name, ' ', '') ;
500+ occurences is not that much so this should execute in no time
Try this
update table_name set column_name = replace(column_name, ' ', '');
The second argument will be replaced by the third argument.
I think this is what we are looking for
SELECT some_columns FROM table_name WHERE REPLACE(col_name, ' ', '') LIKE 'some string';
This is probably your answer:
SELECT replace(col_name , ' ','') FROM table_name;

Remove trailing zeros in decimal value with changing length

I have a procedure I am doing that displays odds but the client wants only significant digits to be shown. So, 1.50 would show as '1.5' and 1.00 would show as '1'.
How can I get MySQL to not display trailing zeros;
i.e. in the database:
Odds
1.500
23.030
2.000
4.450
would display as
1.5
23.03
2
4.45
Thanks for any help
Easiest way by far, just add zero!
Examples:
SET
#yournumber1="1.500",
#yournumber2="23.030",
#yournumber3="2.000",
#yournumber4="4.450"
;
SELECT
(#yournumber1+0),
(#yournumber2+0),
(#yournumber3+0),
(#yournumber4+0)
;
+------------------+------------------+------------------+------------------+
| (#yournumber1+0) | (#yournumber2+0) | (#yournumber3+0) | (#yournumber4+0) |
+------------------+------------------+------------------+------------------+
| 1.5 | 23.03 | 2 | 4.45 |
+------------------+------------------+------------------+------------------+
1 row in set (0.00 sec)
If the column your value comes from is DECIMAL or NUMERIC type, then cast it to string first to make sure the conversion takes place...ex:
SELECT (CAST(`column_name` AS CHAR)+0) FROM `table_name`;
For a shorter way, just use any built-in string function to do the cast:
SELECT TRIM(`column_name`)+0 FROM `table_name`;
EDIT: I would use the answer below by Christopher McGowan instead - adding 0 to the value, which is better, instead.
It's important to check there is actually a decimal point if doing trimming.
So I think you'd want to use:
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' from yourfield)) AS yourfield
FROM yourtable
WHERE yourfield LIKE '%.%'
this worked for me.. round the field to 2 decimal places and then trim any trailing zeros
So that 2.10 is 2.1
SELECT trim(round(FIELDNAME,2))+0
FROM tbl_name
....
To remove trailing zeros from a DECIMAL/NUMERIC or string type column, you can simply cast the value to DOUBLE, e.g.:
SELECT CAST(mycol AS DOUBLE) from mytable;
or
SELECT mycol + 0E0 FROM mytable;
In fact, the "cast to char and add zero" trick mentioned in other answers does the same, but in a more indirect (and likely less efficient) way, e.g:
SELECT CAST(mycol AS CHAR)+0 FROM mytable; -- converts to string, then to number
SELECT TRIM(mycol)+0 FROM mytable; -- ditto
Please use below function , it will take care of number having zero without decimal places i.e 150 etc....
SET #saved_cs_client = ##character_set_client;
SET character_set_client = utf8;
DELIMITER $$
USE `mydbname`$$
DROP FUNCTION IF EXISTS `FN_STRIP_TRAILING_ZER0`$$
CREATE DEFINER=`mydbuser`#`%` FUNCTION `FN_STRIP_TRAILING_ZER0`(tNumber DECIMAL(10,7)) RETURNS VARCHAR(20) CHARSET utf8
BEGIN
DECLARE strBuff VARCHAR(20);
DECLARE cnt NUMERIC(2);
DECLARE tString VARCHAR(20);
SELECT CAST(tNumber AS CHAR) INTO tString;
SELECT LOCATE('.',tString) INTO cnt;
IF cnt > 0 THEN
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM tString)) INTO strBuff;
ELSE
SET strBuff = tString;
END IF;
RETURN strBuff;
END$$
DELIMITER ;
SET character_set_client = #saved_cs_client;
Addendum:
Typically to call this would involve:
SELECT FN_STRIP_TRAILING_ZER0(1.5);
The best solution I found is to cast your round value to FLOAT:
SELECT CAST(ROUND(1.2345984372, 2) AS FLOAT)
Here's what worked for me:
SINGLE COLUMN:
SELECT TRIM(column_name)+0 AS column_name FROM table_name;
MULTIPLE COLUMNS:
SELECT
TRIM(column1)+0 AS column1,
TRIM(column2)+0 AS column2,
TRIM(column3)+0 AS column3,
FROM table_name;
Taking forward the answer provided by #fooquency, if the column is already declared as a DECIMAL with a non-zero value for D in DECIMAL(M, D), we do not need to perform the WHERE condition
WHERE yourfield LIKE '%.%'
as the values in the column will always contain D digits after the decimal dot (.)
If you are using PHP as the scripting language you may use the following:
$var = (float)$var_having_extra_0; // $var = (float) 17.5000
Or use the PHP floatval function:
$var = floatval($var_having_extra_0); // $var = floatval(17.5000)
Using ROUND or CEILING, in the query you just have to type:
SELECT ROUND(2/50)
or
SELECT CEILING(2/50)
I had a similar problem in a situation where I could not modify the code nor the SQL query, but I was allowed to modify the database structure. So I changed the column format from DECIMAL to FLOAT and it solved my problem.
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' from yourfield)) AS yourfield
FROM yourtable
WHERE yourfield LIKE '%.%'
or
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' from yourfield)) AS yourfield
FROM yourtable
WHERE instr(yourfield,'.') != 0
work ok but require a "where" clause.
I think the best solution is probably:
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM ROUND(yourfield,3)))
FROM yourtable
as it doesn't require a "where" clause, doesn't require any special code,
and also lets you set the maximum precision of the number upfront.
Taking fragments of the others answers in this page I came to this conclusion:
SELECT ( IF(
myfield LIKE '%.%',
TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM myfield)),
myfield
) ) FROM mytable
Cheers
SELECT TRIM(TRAILING '0' FROM yourodds)
FROM ...
Docs for the TRIM function.