MySQL: как удалить два или более пробелов из строки?
Я не мог найти этот вопрос для MySQL, вот он:
Мне нужно обрезать все двойные или более пробелы в строке до одного места.
Например:
"   Быстрый; Brown Fox"
должно быть:
"Быстрая коричневая лиса"
Функция REPLACE (str, " ", "") удаляет только два пробела, но оставляет многократные пробелы, когда их больше...
Ответы
Ответ 1
DELIMITER //
DROP FUNCTION IF EXISTS DELETE_DOUBLE_SPACES//
CREATE FUNCTION DELETE_DOUBLE_SPACES(str VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
set str = trim(str);
while instr(str, ' ') > 0 do
set str = replace(str, ' ', ' ');
end while;
return str;
END//
DELIMITER ;
SELECT DELETE_DOUBLE_SPACES(" a b ");
Ответ 2
DELIMITER //
DROP FUNCTION IF EXISTS DELETE_DOUBLE_SPACES//
CREATE FUNCTION DELETE_DOUBLE_SPACES ( title VARCHAR(250) )
RETURNS VARCHAR(250) DETERMINISTIC
BEGIN
DECLARE result VARCHAR(250);
SET result = REPLACE( title, ' ', ' ' );
WHILE (result <> title) DO
SET title = result;
SET result = REPLACE( title, ' ', ' ' );
END WHILE;
RETURN result;
END//
DELIMITER ;
SELECT DELETE_DOUBLE_SPACES('a b');
Ответ 3
Самое короткое и, что удивительно, самое быстрое решение:
CREATE FUNCTION clean_spaces(str VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
while instr(str, ' ') > 0 do
set str := replace(str, ' ', ' ');
end while;
return trim(str);
END
Ответ 4
Это решение не очень элегантно, но поскольку у вас нет другого варианта:
UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, " ", " " ), " ", " " ), " ", " " );
Ответ 5
Я знаю, что этот вопрос отмечен mysql, но если вам посчастливилось использовать MariaDB, вы можете сделать это проще:
SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');
Ответ 6
После поиска я заканчиваю тем, что записываю функцию i.e
функция drop, если существует trim_spaces;
delimiter $$
CREATE DEFINER=`root`@`localhost` FUNCTION `trim_spaces`(`dirty_string` text, `trimChar` varchar(1))
RETURNS text
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare cnt,len int(11) ;
declare clean_string text;
declare chr,lst varchar(1);
set len=length(dirty_string);
set cnt=1;
set clean_string='';
while cnt <= len do
set chr=right(left(dirty_string,cnt),1);
if chr <> trimChar OR (chr=trimChar AND lst <> trimChar ) then
set clean_string =concat(clean_string,chr);
set lst=chr;
end if;
set cnt=cnt+1;
end while;
return clean_string;
END
$$
delimiter ;
ПРИМЕНЕНИЕ:
set @str='------apple--------banana-------------orange---' ;
select trim_spaces( @str,'-')
вывод: apple-banana-orange-
параметр trimChar
для функции может выполняться любым символом, который повторяется, и вы хотите удалить.
Обратите внимание, что он сохранит первый символ в повторяющемся наборе
cheers:)
Ответ 7
Если вы используете php....
try{
$con = new PDO ("mysql:host=localhost;dbname=dbasename","root","");
}
catch(PDOException $e){
echo "error".$e-getMessage();
}
$select = $con->prepare("SELECT * FROM table");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();
while($data=$select->fetch()){
$id = $data['id'];
$column = $data['column'];
$column = trim(preg_replace('/\s+/',' ', $column)); // remove all extra space
$update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
$update->bindParam(':column', $column );
$update->execute();
// echo $column."<br>";
}
Ответ 8
Это немного общее решение: от
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=56195&whichpage=1
create table t (s sysname)
insert into t select 'The Quick Brown Fox'
-- convert tabs to spaces
update t set s = replace(s, ' ',' ')
where charindex(' ', s) > 0
-- now do the work.
while 1=1
begin
update t
set s = substring(s, 1, charindex(' ', s, 1)-1) + ' ' + ltrim(substring(s,charindex(' ', s, 1), 8000))
where charindex(' ', s, 1) > 0
if @@rowcount = 0
break
end
select s
from t
Ответ 9
Если строка, которую вы хотите преобразовать, состоит только из алфавитов и нескольких пробелов [A-Za-z] *, тогда будет работать следующая функция. Я обнаружил шаблон, когда такие строки преобразуются в hex. Исходя из этого, мое решение следует. Не очень элегантный, но он не требует никаких процедур.
unhex(
replace(
replace(
replace(
replace(
replace(
replace(
hex(str)
,204,1014)
,205,1015)
,206,1016)
,207,1017)
,20,'')
,101,20)
)