Sustituyendo parcialmente cadenas en SQL

Me pregunto si se puede hacer directamente en SQL. Tengo un texto con formato de columna con los valores separados por -. Así que un ejemplo de valores de fila podía mirar 1-42-9. Quiero hacer una selección, tales que cada cadena entre el - se sustituye por otro de acuerdo a una cierta lógica. Como un ejemplo, digamos que mi lógica dice que cada cadena igual a 42 debe ser reemplazado por ABC que me daría 1-ABC-9. Se puede hacer esto en un SELECT declaración?

3 Respuestas

  • rad
    4 de mayo de 2019

    El uso de substring y case, se puede hacer algo como lo siguiente:

    select case when '1-42-9' like '%-42-%'
    then replace('1-42-9','-42-', '-ABC-' )
    else '1-42-9' end 
    

    En lugar de la estática de valor de '1-42-9', usted necesita escribir el nombre de la columna.

  • MikeT
    4 de mayo de 2019

    Se puede hacer esto en una instrucción SELECT?

    Sí, usted puede usar la función de reemplazar

    Para hacer hacer sólo el 1 reemplace puede utilizar :-

    SELECT replace(mycolumn,'-42-','ABC') AS mycolumn FROM mytable;
    

    Un ejemplo que muestra este sencillo singular de reemplazo es :-

    DROP TABLE IF EXISTS mytable;
    CREATE TABLE IF NOT EXISTS mytable (mycolumn);
    INSERT INTO mytable VALUES ('1-42-9'),('1429'); -- add some data (one row to be changed, the other not to be changed)
    SELECT replace(mycolumn,'-42-','ABC') AS mycolumn FROM mytable; -- Do the replace maintaing the column name
    

    Esto se traduce en :-

    enter image description here

    Si usted quiere que la más compleja de reemplazo decir la sustitución de dos artículos que usted podría utilizar anidada reemplaza , señalando que esto puede ser bastante tedioso como el reemplazo de la orden es relevante, por ejemplo, para reemplazar -9 con XYZ y -42 - con ABC para que 1-42-9 convertido en 1ABCXYZ, a continuación, puede utilizar :-

    SELECT replace(replace(mycolumn,'-9','-XYZ'),'-42-','ABC') AS mycolumn FROM mytable;
    

    Si usted quería múltiples sustituciones de los cuales sólo 1 se haría decir -42 - se sustituye con ABC o -43 - con DEF o -44 - con GHI, entonces usted podría utilizar un CASO CUANDO, a CONTINUACIÓN, TERMINAR de construir a lo largo de las líneas de :-

    SELECT
        CASE 
          WHEN instr(mycolumn,'-42-') THEN replace(mycolumn,'-42-','ABC')
          WHEN instr(mycolumn,'-43-') THEN replace(mycolumn,'-43-','DEF')
          WHEN instr(mycolumn,'-44-') THEN replace(mycolumn,'-44-','GHI')
          ELSE mycolumn
      END AS mycolumn
    FROM mytable;
    
  • forpas
    4 de mayo de 2019

    Si la columna contiene un valor, tales como '1-42-9' y quiere buscar para '42' para reemplazar con 'ABC', entonces usted debe tomar en cuenta todos los casos como:

    • '42' está al principio de la columna
    • '42' está en el medio de la columna
    • '42' al final de la columna
    • '42' no existe en la columna

    Estos 4 casos pueden ser manejados con una más complicada, pero método preciso:

    update tablename
    set col = substr(
      replace('-' || col || '-', '-42-', '-ABC-'), 
      2,
      length(replace('-' || col || '-', '-42-', '-ABC-')) - 2
    )
    where '-' || col || '-' like '%-42-%';
    

    Ver la demo.
    Para estos valores:

    create table tablename (col TEXT);
    insert into tablename (col) values
    ('1-42-9'),
    ('42-1-9'),
    ('9-1-42'),
    ('1-100-9');
    

    Los resultados son:

    | col     |
    | ------- |
    | 1-ABC-9 |
    | ABC-1-9 |
    | 9-1-ABC |
    | 1-100-9 |