-3

mysqlデータベースから画像名を取得しています。png拡張子の付いた2〜3語の画像があります。また、名前にはハイフェン記号が含まれています。まず、ハイフェン記号の左右のスペースを削除します。次に、2つの単語の間のスペースをアンダースコア記号に置き換えます。どうすればこれに対するクエリを書くことができますか?

2番目の場合:

UPDATE table_name set colname = replace(colname、''、'')

最初のタスクのクエリを手伝ってください...よろしくお願いします

4

2 に答える 2

1

いくつか使用できるようですねREPLACE

SELECT
  REPLACE(
    REPLACE(
      REPLACE(
        name,
        ' -',
        '-'
      ),
      '- ',
      '-'
    ),
    ' ',
    '_'
  ) as new_name
于 2012-07-07T09:20:16.993 に答える
1

構造化データを保持するために文字列を使用しているようですが、これはMySQLのようなリレーショナルデータベース管理システムの効率的な使用法ではありません。各個別のデータユニットが独自の列に含まれるようにスキーマを変更することをお勧めします。その後、データベースからデータを取得するときに、必要な文字列を再構築できます)。

ただし、特定の質問に答えると、何が必要かが明確ではありません。

  • 複数のハイフンの両側にある最大1つのスペースを削除したい場合は、PugganSeの答えが最適です。

  • 複数のハイフンの両側にあるスペースを1つだけ削除する場合は、同じ答えを少し簡略化できます。

    REPLACE(REPLACE(colname, ' - ', '-'), ' ', '_')
    
  • 単一のハイフンの両側にある複数のスペースを削除する場合は、MySQLのSUBSTRING_INDEX()関数を使用して文字列を分割し、結果をトリミングすることをお勧めします。

    REPLACE(CONCAT(
      RTRIM(SUBSTRING_INDEX(colname, '-',  1)),
      '-',
      LTRIM(SUBSTRING_INDEX(colname, '-', -1))
    ), ' ', '_')
    
  • 複数のハイフンの両側にある複数のスペースを削除する場合は、文字列をループする関数を作成する必要があります。

    DELIMITER ;;
    
    CREATE FUNCTION trim_delim (
        IN input TEXT
      , IN delim CHAR(1)
    )
    RETURNS TEXT
    DETERMINISTIC
    BEGIN
      DECLARE i      INT DEFAULT 1 ;
      DECLARE result TEXT;
    
      WHILE CHAR_LENGTH(input) > 0 AND cur_position > 0 DO
        SET i      := INSTR(input, delim);
    
        SET result := CONCAT(
          IF(CHAR_LENGTH(result) > 0, CONCAT(result, delim), ''),
          IF(i, RTRIM(LEFT(input, i - 1)), input)
        );
    
        SET input  := LTRIM(SUBSTRING(input, i + 1));
      END WHILE;
    
      RETURN result;
    END;;
    
    DELIMITER ;
    

    次に、この関数を次のように使用できます。

    REPLACE(trim_delim(colname, '-'), ' ', '_')
    
于 2012-07-07T10:05:53.167 に答える