sql >> Databáze >  >> RDS >> Mysql

Postup pro procházení řetězce odděleného čárkami nefunguje

Možná je tento příspěvek příliš starý, ale zkusil jsem kód předložený Devartem a nefunguje mi.

S malými úpravami mi tato verze funguje:

DELIMITER $$

CREATE PROCEDURE procedure1(IN strIDs VARCHAR(255))
BEGIN
  DECLARE strLen    INT DEFAULT 0;
  DECLARE SubStrLen INT DEFAULT 0;

  IF strIDs IS NULL THEN
    SET strIDs = '';
  END IF;

do_this:
  LOOP
    SET strLen = CHAR_LENGTH(strIDs);

    UPDATE TestTable SET status = 'C' WHERE Id = SUBSTRING_INDEX(strIDs, ',', 1);

    SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
    SET strIDs = MID(strIDs, SubStrLen, strLen);

    IF strIDs = '' THEN
      LEAVE do_this;
    END IF;
  END LOOP do_this;

END
$$

DELIMITER ;

Vysvětlení:

1) Proč "+2" V SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

Když spustíte funkci MID na dalším řádku, index řetězce začíná 1. Pokud máte následující řetězec '4500,2' s verzí Devart, MID vypadá jako MID('4500,2',4,6), což je návrat ',2'.

Takže pokud přidáte 1 k délce podřetězce, jste na oddělovači. To nestačí. Takže přidáte délku oddělovače. Teď je to dobré.

2) Proč IF strIDs = '' THEN ve stavu smyčky?

Protože když uděláte MID, vrátíte řetězec, i když je tento řetězec prázdný.

Postup Devart je opraven! Moc děkuji za odpověď :)



  1. Odstraňte stejný řádek vložený do tabulky pomocí triggeru v mysql

  2. Postgresql join_collapse_limit a čas pro plánování dotazů

  3. Jak mohu zálohovat vzdálenou databázi SQL Server na místní jednotku?

  4. Skript Liquibase vrací ORA-01843:neplatný měsíc