mysql - how to replace a sub-string? - mysql

a field is a varchar, i want to replace a sub string of this field.
ab123fg => ab456fg
the above is just a example.
just like the sub string to be replaced.

http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_replace
REPLACE(str, 'ab123fg ', 'ab456fg')
EDIT:
MySQL doesnt have a find and replace regex function, maybe have a look at UDFs

Related

filter string only contains q in mysql

I need help in mysql query, i written this query
select * from post where content REGEXP '^q'
this query is working but it also includes spaces in filter, what i want to do if any content string like "qqqqqq" or "qqqq" or "qqq" or "qq" or "q" for this string only it should have to filter, right now what is happening if i have string like "qqqq qq" then also it is giving me the result, it should not consider that space, can anyone please help me to resolve this issue ?
You can fix your regexp like next:
select * from post where content REGEXP '^q+$';
This regular expression mean the string starts with q and contain only 1 or more q symbols till end of string
Test it on SQLize.online
Try Using this ^q+(?![\s])+$ Regular Expression.
Above RegExp will check for string starting with q and without space.
You don't really need a regex for this. String functions are likely to be more efficient. You can replace all "q"s with empty strings, and ensure that that resulting string is empty:
select * from post where replace(content, 'q', '') = ''
Note that this also allows the empty string. If you want to avoid that, then:
select * from post where content <> '' and replace(content, 'q', '') = ''

Strip special characters and space of a DB column to compare in rails

I have 4 types of last_name:
"Camp Bell"
"CAMPBELL"
"CampBellJr."
"camp bell jr."
Now, in rails when an user is searched by it's last name like camp bell, I want to show all the 4 records. So, I tried:
RAILS
stripped_name = params[last_name].gsub(/\W/, '')
#=> "campbell"
User.where("LOWER(REPLACE(last_name, '/\W/', '')) LIKE ?", "#{stripped_name}%")
Give me only 2 records with following last_name:
"CAMPBELL"
"CampBellJr."
I guess, this is because, the mysql REPLACE is not working correctly with regex.
Any ideas?
EDIT
Guys, sorry for the confusion. My idea is to strip off all special characters including space. So I'm trying to use \W regex.
For example, the input can be: camp~bell... But, it should still fetch result.
You can check for both stripped_name without space and ones that include both names seperated with space like this.
stripped_name = params[last_name].gsub(/\W/, '')
split_names = params[last_name].split(" ")
User.where('name LIKE ? OR (name LIKE ? AND name LIKE ?)', "%#{stripped_name}%", "%#{split_names[0]}%", "%#{split_names[1]}%")
Next step would to search for complete array of split names not just first two.
Here my solution:
User.where("REPLACE(last_name, ' ', '') ILIKE CONCAT ('%', REPLACE('?', ' ', ''),'%')", stripped_name)
ILIKE is like LIKE but the I is for insensitive case.
To understand easily step by step:
lastname ILIKE '%campbell% you need % because you want lastname
contain this string, not necessary at the begin or the end of you
string.
'campbell%' => search string who begin by campbell
'%campbell' => search string who finish by campbell
We need generate '%campbell%, so we use CONCAT for that
I just use a simply REPLACE, but maybe you should use a regex.

MySQL - How to get the string next after to a symbol?

For Example: word_word_#_word_word
i want to replace third word from left after the #_ by someother word, i dont know the exact string from the database. So how can i write sql query for this.
use replace:
select SELECT REPLACE('word_word_#_word_word', '#_word', '#_otherword');
Use Stuff function
Declare #String varchar(200)='word_word_#_word_word'
SELECT #String AS GivenString,STUFF(#String,(CHARINDEX('#_',#String)+2),0,'Otherword'+'_') AS Otherword_Column
OutPut
GivenString Otherword_Column
------------------------------------------------------
word_word_#_word_word word_word_#_Otherword_word_word

REPLACE string in MySQL but only specified part

i would like to replace string in my query but only on the end of the string this is my example:
SET #exampleString = 'example_a_chapter_a';
SELECT REPLACE(#exampleString ,'_a','_b1');
Result what I get is this: example_b1_chapter_b1
But i would like this: example_a_chapter_b1
But there can be more time the '_a' in the string as this 'example_a_type_a_chapter_a', but
i would like to replace just the end '_a' of the string.
Thanks for you help
This will be tricky since MySQL can not replace by regex. One of possible ways is:
SELECT REPLACE(REPLACE(CONCAT(#exampleString, '#END'), '_a#END', '_b1'), '#END', '');
-i.e. add something that 100% is not in original string, to it's end and then replace.
Edit: second REPLACE is needed in case if original string doesn't end with _a (so you'll need to remove added #END)
You could not use replace() at all. Just reconstruct the string:
select (case when #exampleString like '%_a'
then concat(left(#exampleString, length(#exampleString) - length('_a')),
'_b1'
)
else #exampleString
end)
This has the advantage that it works even when the string doesn't end in '_a'.

Incrementing numerical value and changing string in SQL

I have a database that has stored values in a complicated, serialized array where one component is a string and another is the length of the characters of the string, in this format:
s:8:"test.com"
Where "s" holds the character length of the string in the quotations.
I would like to change the string from "test.com" to "testt.com", and I'm using the following statement in SQL:
UPDATE table SET row=(REPLACE (row, 'test.com','testt.com'))
However, this breaks the script in question, because it doesn't update the character length in the "s" preceding the string where "test.com" is stored.
I was wondering if there is a query I can use that would replace the string, and then also increment the value of this "s" preceding to where the replacement occurs, something like this:
UPDATE table SET row=(REPLACE (row, 's:' number 'test.com','s:' number+1 'testt.com'))
Does anyone know if this kind of query is even possible?
UPDATE table set row = concat('s:',length('testt.com'),':"testt.com"');
If you need to change exact string, then use exact query -
UPDATE table SET row = 's:9:"testt.com"' WHERE row = 's:8:"test.com"';
The string is a "serialized string".
If there are multiple strings to be replaced, it might be easier to create a script to handle this.
In PHP, it goes something like this:
$searchfor = serialize('test.com');
$replaceby = serialize('testt.com');
// strip last semicolon from serialized string
$searchfor = trim($searchfor,';');
$replaceby = trim($replaceby,';');
$query = "UPDATE table SET field = '$replaceby' WHERE field = '$searchfor';";
This way, you can create an exact query string with what you need.
Do fill in the proper code for db connection if necessary.