Tengo la siguiente tabla en postgres.
col1 col2 col3 NCT00000412 Drug Placebo Calcitriol NCT00000412 Drug Placebo Alendronate NCT00000774 Biological Placebo version of rgp120/HIV-1MN NCT00000774 Biological Placebo version of rgp120/HIV-1SF2 NCT00005648 Drug Gemcitabine with Placebo NCT00007631 Drug Tretinoin 0.1% cream or placebo NCT00007735 Drug Doxycycline (200mg/day) or Placebo NCT00032435 Drug PAL-40 Placebo NCT00032435 Drug abciximab placebo; reteplase placebo, abciximab NCT00032435 Drug Valsartan placebo + nateglinide placeboEstoy tratando de extraer esas filas donde la palabra placebo tiene una sola palabra antes o después. La salida esperada es:
col1 col2 col3 NCT00000412 Drug Placebo Calcitriol NCT00000412 Drug Placebo Alendronate NCT00032435 Drug PAL-40 PlaceboHe intentado siguiendo expresiones regulares:
select * from table where name ~* '\splacebo\w+' or name ~* '\w+placebo\s'Puedes utilizar
select * from table where name ~* '^(?:placebo\s+\S+|\S+\s+placebo)$'Vea la demostración de expresiones regulares
Detalles
^ - comienzo de la cadena(?:placebo\s+\S+|\S+\s+placebo) - un grupo sin captura que coincide conplacebo\s+\S+ - placebo , luego 1+ espacios en blanco y luego 1+ espacios que no son en blanco| - o\S+\s+placebo - 1+ espacios sin espacios en blanco, luego 1+ espacios en blanco y luego placebo$ - final de la cadena.Creo que quieres:
where col3 ~* '(^\S+\s+placebo)|(placebo\s+\S+$)'Desglose:
( ^ beginning of the string \S+ 1 to N characters other than a space \s+ 1 to N spaces placebo literal string "placebo" ) | OR ( placebo literal string "placebo" \s+ 1 to N spaces \S+ 1 to N characters other than a space $ end of the string ) Usé \S en lugar de \w porque quieres hacer coincidir los guiones (lo que \w no hace).
Como nota, puedes hacer esto simplemente usando like :
where (name like '% Placebo%' and name not like '% % Placebo%') or (name like '%Placebo %' and name not like '%Placebo % %')