Strings são onde moram as queries de verdade
Trabalhar com números é tranquilo. O problema mora nas strings — nomes com espaços sobrando, e-mails em maiúsculas e minúsculas misturadas, IDs colados com hífens, campos de texto livre que quase batem, mas não exatamente. O SQLite oferece um conjunto enxuto e direto de funções de string que resolve a maior parte disso sem precisar recorrer ao código da aplicação.
Esta página passa pelas funções que você vai usar primeiro no dia a dia: concatenar, fatiar, buscar, substituir, limpar e formatar.
Concatenar string no SQLite usa ||, não CONCAT
O SQLite não tem a função CONCAT. Para juntar strings, usa-se o operador ||:
Números e outros tipos são convertidos para texto automaticamente. O detalhe que pega muita gente: se qualquer operando for NULL, a expressão inteira vira NULL. Esse é o comportamento padrão do SQL, mas ainda surpreende bastante:
Use COALESCE(col, '') ou COALESCE(col, 'default') em colunas que aceitam NULL sempre que você não quiser que um valor ausente acabe com a string inteira.
LENGTH, UPPER e LOWER
As três funções de string que você vai usar o tempo todo no SQLite:
LENGTH retorna a quantidade de caracteres em um texto, não de bytes. Se você precisa mesmo dos bytes (caso raro, mas útil em análises de armazenamento), use OCTET_LENGTH. Já UPPER e LOWER só convertem letras ASCII por padrão — caracteres acentuados passam batido, a menos que você tenha carregado a extensão ICU.
SUBSTR: extraindo substring no SQLite
A função SUBSTR(text, start, length) extrai um pedaço de uma string. O importante aqui é lembrar que os índices começam em 1 — ou seja, 1 é o primeiro caractere, não 0:
Algumas coisas para ter em mente:
- O terceiro argumento é opcional. Sem ele, você pega tudo desde
startaté o final da string. - Um valor negativo em
startconta a partir do final. - Se
startultrapassar o tamanho da string, você recebe uma string vazia — não dá erro.
SUBSTRING também funciona como sinônimo, caso sua memória muscular venha de outro banco de dados.
INSTR: encontrando a posição de uma substring no SQLite
INSTR(haystack, needle) devolve a posição (começando em 1) da primeira ocorrência de needle dentro de haystack, ou 0 quando não encontra nada:
Essa última expressão é o jeito clássico do SQLite de pegar "tudo o que vem antes do @": você localiza o delimitador com INSTR e fatia a string com SUBSTR. Essa dupla aparece o tempo todo no seu dia a dia. Mas atenção: como INSTR devolve 0 quando não encontra nada, sempre confira antes de fatiar — passar 0 para SUBSTR retorna resultados estranhos sem dar nenhum aviso.
REPLACE: trocando um trecho por outro
A função REPLACE(texto, antigo, novo) substitui todas as ocorrências de antigo por novo:
É sensível a maiúsculas/minúsculas e não aceita regex — só uma substring literal. Para transformações mais complexas, dá para encadear chamadas de REPLACE, mas quando passa de duas ou três aninhadas, é melhor resolver isso na aplicação.
TRIM, LTRIM e RTRIM no SQLite
Dados digitados pelo usuário quase sempre vêm com espaços sobrando nas pontas. O TRIM remove tudo isso:
Por padrão, essas funções removem espaços. Se quiser tirar outros caracteres, passe um segundo argumento — mas atenção: cada caractere desse segundo argumento é tratado como parte de um "conjunto de caracteres a remover", e não como um substring literal. Por isso TRIM('xxxhelloxx', 'x') devolve 'olá'.
printf no SQLite: formatando números e strings
Quando você precisa de uma string formatada — casas decimais fixas, números com preenchimento, saída em hexadecimal — quem resolve é o printf (que também atende pelo nome de format):
Os especificadores de formato seguem as convenções do C, ou seja, %d, %s, %f, %x, padding com 0 ou espaços, e por aí vai. Fica bem mais limpo do que montar strings na mão usando || e um monte de CAST.
LIKE vs GLOB: comparando padrões no sqlite
Dois operadores, dois mundos completamente diferentes.
O LIKE usa os curingas clássicos do SQL — % para qualquer sequência de caracteres e _ para um único caractere — e é case-insensitive para ASCII:
GLOB segue os curingas do shell Unix — * para qualquer sequência, ? para um único caractere e [abc] para classes de caracteres. Vale lembrar que ele diferencia maiúsculas de minúsculas:
A regra para escolher entre os dois: use LIKE quando você quer aquele match no estilo humano de "começa com", "contém" ou "termina com". Use GLOB quando importa diferenciar maiúsculas de minúsculas ou quando você precisa de classes de caracteres. Os dois conseguem aproveitar índices, mas só quando o padrão está ancorado no início ('foo%', e não '%foo') — curinga no começo obriga o SQLite a varrer a tabela inteira.
Split string no SQLite: como dar o jeitinho sem SPLIT
O SQLite não traz uma função SPLIT_STRING nativa. Na prática, sobram duas saídas:
Pra dividir uma string por um delimitador e jogar cada parte em uma linha, o caminho mais limpo é usar json_each em cima de um array JSON, ou então uma CTE recursiva. Vamos ver isso nos próximos capítulos — por enquanto, só guarde que "me devolve cada palavra" não é uma linha só no SQLite.
Exemplo prático: limpando nomes bagunçados
Hora de juntar tudo. Imagine uma tabela users com nomes de exibição uma zona — espaços a mais, caixa misturada e prefixos opcionais tipo "Dr. " ou "Mr. " que você quer remover:
A expressão se lê de dentro para fora: tira o espaço em branco externo, passa para minúsculas, remove os títulos e aplica o trim de novo, caso a remoção do título tenha deixado um espaço sobrando no começo. Cada etapa é uma única função — a complexidade vem do empilhamento. Quando essa pilha passa de três ou quatro níveis, é um sinal de que talvez seja melhor usar uma coluna gerada (Capítulo: Recursos Avançados) ou fazer a limpeza já na importação dos dados.
O que fica de aprendizado
||para concatenar;NULLcontamina o resultado, então useCOALESCE.SUBSTReINSTRjuntos resolvem a maior parte dos casos de "achar e fatiar".REPLACEtroca todas as ocorrências de uma substring literal.TRIMe companhia aceitam um conjunto de caracteres personalizado, não só espaço em branco.printfé a ferramenta certa para saída formatada.LIKEpara curingas SQL sem diferenciar maiúsculas/minúsculas;GLOBpara padrões estilo shell, com diferenciação.
Próximo: funções numéricas
Com strings dominadas, o próximo passo natural são os números — arredondamento, valor absoluto, peculiaridades de divisão e as funções matemáticas que o SQLite passou a oferecer nas versões mais recentes. É o assunto da próxima página.
Perguntas frequentes
Como concatenar strings no SQLite?
Usa-se o operador ||, e não CONCAT. O SQLite não tem a função CONCAT por padrão — 'Olá, ' || nome junta as duas strings em uma só. Atenção: se qualquer um dos operandos for NULL, o resultado inteiro vira NULL. Quando isso não é o que você quer, envolva as colunas que podem ser nulas com COALESCE.
Como pegar uma substring no SQLite?
Use SUBSTR(texto, inicio, tamanho) — também aceito como SUBSTRING. Os índices começam em 1: SUBSTR('hello', 1, 3) devolve 'hel'. Se o início for negativo, ele conta a partir do fim, e o argumento de tamanho é opcional — basta omitir para pegar tudo até o final da string.
O SQLite tem alguma função SPLIT_STRING?
Não — o SQLite não tem função de split nativa. Na maioria dos casos dá pra combinar INSTR e SUBSTR para extrair o pedaço que interessa, ou usar uma CTE recursiva para quebrar a string num delimitador. Se você precisa fazer isso com frequência, normalmente é mais limpo usar json_each em cima de um array JSON do que escrever seu próprio splitter.
Qual a diferença entre LIKE e GLOB no SQLite?
O LIKE é case-insensitive para ASCII por padrão e usa % e _ como curingas. Já o GLOB é case-sensitive e adota os curingas do shell Unix (*, ?, [abc]). Vá de GLOB quando precisar diferenciar maiúsculas/minúsculas ou usar classes de caracteres; fique no LIKE quando quiser a sintaxe mais tradicional do SQL.