Portanto, tenho um em meu Postgresql:
TAG_TABLE
==========================
id tag_name
--------------------------
1 aaa
2 bbb
3 ccc
Para simplificar meu problema, o que eu quero fazer é SELECT 'id' em TAG_TABLE quando uma string "aaaaaaaa" contém o 'tag_name'. Portanto, o ideal é que ele retorne apenas "1", que é o ID do nome da tag 'aaa'
Isso é o que estou fazendo até agora:
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'
Mas, obviamente, isso não funciona, uma vez que o postgres pensa que '% tag_name%' significa um padrão contendo a substring 'tag_name' em vez do valor real dos dados sob essa coluna.
Como faço para passar o tag_name para o padrão ??
sql
postgresql
user2436815
fonte
fonte
"; drop table TAG_TABLE; --"
?WHERE
cláusula avalia paraFALSE
. A instrução não é dinâmica, apenas os valores são concatenados, sem chance de injeção de SQL.LIKE
palavra - chave.LIKE
padrão pode ter consequências indesejadas quando essas variáveis contêm sublinhados (_) ou caracteres de porcentagem (%). Pode ser necessário escapar esses caracteres, por exemplo com esta função:CREATE OR REPLACE FUNCTION quote_for_like(text) RETURNS text LANGUAGE SQL IMMUTABLE AS $$ SELECT regexp_replace($1, '([\%_])', '\\\1', 'g'); $$;
(do usuário MatheusOl do canal IRC #postgresql em Freenode).Eu pessoalmente prefiro a sintaxe mais simples do operador ~.
Vale a pena ler Diferença entre LIKE e ~ no Postgres para entender a diferença. `
fonte
tag_name
é um REGEX adequado. Muito arriscado.***=
qual é mencionado em postgresql.org/docs/current/static/functions-matching.html . No entanto, descobri que isso é muito mais lento em comparação com as soluçõesstrpos
/position
.Uma maneira adequada de pesquisar uma substring é usar
position
função em vez delike
expressão, que requer escape%
,_
e um caractere de escape (\
por padrão):fonte
LIKE
eILIKE
pode usargin
índices.position
não podes.Além da solução com
'aaaaaaaa' LIKE '%' || tag_name || '%'
háposition
(ordem reversa de args) estrpos
.Além do que é mais eficiente (LIKE parece menos eficiente, mas um índice pode mudar as coisas), há um problema muito pequeno com LIKE: o tag_name obviamente não deve conter
%
e, especialmente_
(caractere curinga único), para não dar falsos positivos.fonte
tag_name
deve estar entre aspas, caso contrário irá dar um erro porque tag_name não existefonte