SQL Funções de Texto

Esta é a página de consulta rápida das funções que trabalham com texto no SQLite 3.50: juntar, medir, cortar, trocar, limpar e formatar. Cada linha das tabelas traz um exemplo e o resultado que ele dá de verdade. A explicação passo a passo, com exercícios, está na aula Funções de Texto.

Como ler as tabelas
  • Exemplo é o que vai dentro de um SELECT: para testar, escreva SELECT antes e ; depois, como em SELECT upper('Ana');.
  • Resultado foi colhido no editor do guia (SQLite 3.50.4). NULL quer dizer "sem valor". Espaços que importam aparecem entre colchetes, como [Ana   ].
  • Texto vai sempre entre aspas simples. Para pôr uma aspa dentro do texto, dobre-a: 'Loja D''Água'.
  • Quase todas as funções devolvem NULL quando recebem NULL (as exceções estão marcadas).

Juntar textos

Função / operadorO que fazExemploResultadoAula
a || bJunta (concatena) dois valores. Números viram texto.'Ana' || ' ' || 'Sousa'Ana SousaFunções de Texto
Número junto com texto'Pedido nº ' || 7Pedido nº 7
Com NULL, o resultado inteiro vira NULL'Ana' || NULLNULLO Valor NULL
concat(x, …)Junta todos os argumentos. Ignora os NULL.concat('Ana', NULL, 'Sousa')AnaSousaFunções de Texto
concat_ws(sep, x, …)Junta com um separador entre os valores (ws = with separator, "com separador"). Pula os NULL sem deixar separador sobrando.concat_ws(', ', 'Porto', NULL, 'Portugal')Porto, PortugalFunções de Texto
group_concat(x, sep) e string_agg(x, sep)Juntam os valores de várias linhas num texto só. São funções agregadas.veja Funções AgregadasGROUP BY

Com dados da Loja Aurora: o || monta "cidade (UF)", e o concat_ws lida bem com o estado NULL dos fornecedores estrangeiros:

SELECT nome,
       concat_ws(' / ', cidade, estado, pais) AS local
FROM fornecedores;

Repare nas linhas de Porto e Buenos Aires: o estado é NULL, e o concat_ws simplesmente o pulou. Com cidade || ' / ' || estado || ' / ' || pais, essas duas linhas sairiam NULL inteiras.


Medir

FunçãoO que fazExemploResultadoAula
length(x)Quantos caracteres o texto tem (letras acentuadas contam 1).length('Conceição')9Funções de Texto
Num número, mede o número escrito como textolength(1234.5)6
Texto vazio tem 0; um espaço tem 1length(''), length(' ')0, 1
octet_length(x)Quantos bytes o texto ocupa. Em UTF-8, cada letra acentuada ocupa 2 bytes.octet_length('Conceição')11Os Tipos no SQLite

Maiúsculas e minúsculas

FunçãoO que fazExemploResultadoAula
upper(x)Passa para MAIÚSCULAS (upper case).upper('Ana Beatriz')ANA BEATRIZFunções de Texto
Só as letras sem acento mudam!upper('Conceição')CONCEIçãO
lower(x)Passa para minúsculas (lower case). Mesmo limite.lower('JOSÉ RIBAMAR')josÉ ribamarFunções de Texto
x = y COLLATE NOCASECompara sem diferenciar maiúsculas de minúsculas (também só nas letras sem acento).'Ana' = 'ana' COLLATE NOCASE1 (verdadeiro)Comparações
'Água' = 'água' COLLATE NOCASE0 (falso)
Acentos e maiúsculas no SQLite

O SQLite que vem pronto só sabe trocar a caixa das 26 letras do alfabeto inglês (A a Z). Letras como é, ç, ã ficam como estão. Veja nos clientes da loja:

SELECT nome, upper(nome) AS maiusculo, length(nome) AS letras
FROM clientes
WHERE id IN (1, 5, 9);

O length conta certo (as letras acentuadas valem 1), mas o upper deixou é, ç, ã e ô minúsculos. Para trocar a caixa de qualquer letra, o SQLite precisa de uma extensão chamada ICU, que não vem no editor do guia nem no sqlite3 padrão. Os outros bancos (MySQL, PostgreSQL, SQL Server) tratam os acentos corretamente.


Cortar, procurar e trocar

FunçãoO que fazExemploResultadoAula
substr(x, início, n)Pedaço do texto: começa na posição início (a primeira letra é 1) e pega n caracteres.substr('Lápis Grafite HB', 1, 5)LápisFunções de Texto
substr(x, início)Sem o n: vai até o fim.substr('Lápis Grafite HB', 7)Grafite HB
início negativo conta do fim para trás.substr('Lápis Grafite HB', -2)HB
Começo depois do fim: texto vazio.substr('Teresina', 10)(texto vazio)
substring(x, início, n)Outro nome do substr (o nome do padrão SQL).substring('Teresina', 1, 3)Ter
instr(x, procurado)Posição da primeira vez que procurado aparece em x (in string, "no texto"). 0 se não aparece.instr('ana.beatriz@exemplo.com.br', '@')12Funções de Texto
Não achouinstr('Teresina', 'x')0
replace(x, de, para)Troca todas as vezes que de aparece por para. Diferencia maiúsculas.replace('2026-10-18', '-', '/')2026/10/18Funções de Texto
Trocar por '' apagareplace('Loja D''Água', '''', '')Loja DÁgua

Combinando substr e instr: tudo o que vem depois do @ do email (o domínio):

SELECT nome, substr(email, instr(email, '@') + 1) AS dominio
FROM clientes
WHERE id <= 3;

Limpar as pontas

FunçãoO que fazExemploResultadoAula
trim(x)Tira os espaços do começo e do fim (trim = "aparar").'[' || trim(' Ana ') || ']'[Ana]Funções de Texto
ltrim(x)Só da esquerda (left).'[' || ltrim(' Ana ') || ']'[Ana   ]
rtrim(x)Só da direita (right).'[' || rtrim(' Ana ') || ']'[   Ana]
trim(x, letras)Com o segundo argumento, tira qualquer das letras dadas, em vez de espaços.trim('--PI--', '-')PI
ltrim(x, letras)ltrim('000123', '0')123
rtrim(x, letras)rtrim('Teresina...', '.')Teresina

Formatar: format() e printf()

format(modelo, valores…) monta um texto a partir de um modelo: cada % do modelo é trocado pelo próximo valor. printf é outro nome da mesma função (o nome antigo, que vem da linguagem C).

No modeloO que fazExemploResultado
%sPõe o valor como texto (string).format('%s mora em %s', 'Ana', 'Teresina')Ana mora em Teresina
%dNúmero inteiro (decimal).format('%d%%', 15)15%
%.2fNúmero com 2 casas depois do ponto (float).format('R$ %.2f', 89.99)R$ 89.99
format('%.2f', 3.5)3.50
%05dInteiro com 5 posições, completando com zeros à esquerda.printf('%05d', 42)00042
%8s / %-8sOcupa 8 posições, alinhado à direita / à esquerda (com -).format('[%8s]', 'Ana')
format('[%-8s]', 'Ana')
[     Ana]
[Ana     ]
%,dInteiro com separador de milhar (vírgula, no estilo americano).format('%,d', 1234567)1,234,567
%xInteiro em hexadecimal.format('%x', 255)ff
%eNotação científica.format('%e', 1234.5)1.234500e+03
%qTexto com as aspas simples dobradas (pronto para ir dentro de '…').format('%q', 'Loja D''Água')Loja D''Água
%%Um % de verdade.format('%%')%

O uso mais comum na loja: mostrar o preço com duas casas.

SELECT nome, format('R$ %.2f', preco) AS preco
FROM produtos
WHERE id <= 3;
Vírgula ou ponto?

O format sempre usa ponto nos decimais e vírgula no milhar, como nos Estados Unidos. Para o formato brasileiro (R$ 1.234,50), troque os sinais com replace ou, melhor, deixe a formatação para o programa que mostra os dados ao usuário.


Comparar com padrões

Operador / funçãoO que fazExemploResultadoAula
x LIKE padrãoCompara com curingas: % = qualquer sequência, _ = um caractere. Não diferencia maiúsculas (nas letras sem acento).'Ana Beatriz' LIKE 'ana%'1LIKE
Com acento, diferencia'Água' LIKE 'água'0Curingas
x GLOB padrãoCuringas do estilo do terminal: * e ?. Diferencia maiúsculas.'Ana Beatriz' GLOB 'ana*'0Curingas
'Ana Beatriz' GLOB 'Ana*'1
like(padrão, x)O LIKE escrito como função. Atenção: o padrão vem primeiro.like('ana%', 'Ana Beatriz')1
glob(padrão, x)O GLOB como função, também com o padrão primeiro.glob('A*', 'Ana')1

Códigos, bytes e aspas

FunçãoO que fazExemploResultado
char(n, …)Monta um texto a partir dos códigos Unicode das letras.char(65, 110, 97)Ana
unicode(x)O código Unicode da primeira letra.unicode('Água')193
hex(x)Os bytes do valor escritos em hexadecimal.hex('Ana')416E61
unhex(x)O contrário do hex: devolve os bytes (um valor do tipo blob).typeof(unhex('416E61'))blob
quote(x)Escreve o valor como ele seria escrito num comando SQL: texto entre aspas (com as aspas de dentro dobradas), NULL como a palavra NULL.quote('Loja D''Água')'Loja D''Água'
Funciona com NULL (não devolve NULL)quote(NULL)NULL (o texto)
unistr(x)Novo no 3.50: troca códigos como \u00e1 pela letra.unistr('Ol\u00e1')Olá
unistr_quote(x)Novo no 3.50: como o quote, mas escreve caracteres de controle (como a quebra de linha) com \u.unistr_quote(char(65, 10, 66))unistr('A\u000aB')
CAST(x AS TEXT)Converte um valor em texto.CAST(123 AS TEXT) || '!'123!
typeof(x)Diz o tipo do valor: text, integer, real, blob ou null.typeof('Ana')text

Funções que o SQLite não tem

Quem vem de outro banco sente falta de algumas funções. Todas dão no such function no SQLite, mas há um jeito de fazer cada uma:

Em outros bancosO que fazNo SQLiteResultado
LEFT('Teresina', 4)as primeiras 4 letrassubstr('Teresina', 1, 4)Tere
RIGHT('Teresina', 4)as últimas 4 letrassubstr('Teresina', -4)sina
LPAD(42, 5, '0')completar com zeros à esquerdaprintf('%05d', 42) ou substr('00000' || 42, -5)00042
RPAD('Ana', 8)completar com espaços à direitaformat('%-8s', 'Ana')Ana     
REPEAT('*', 5)repetir um caractereprintf('%.*c', 5, '*')*****
LEN(x) (SQL Server)tamanholength(x)
SOUNDEX(x)código de "som parecido"Existe no SQLite só quando ele é compilado com essa opção; no editor e no sqlite3 do guia, dá no such function: soundex.
SELECT left('Teresina', 3);

Nos outros bancos

Os mesmos serviços, nomes diferentes

Conferido nas documentações oficiais do MySQL 8.4, do PostgreSQL e do SQL Server. Os trechos não rodam no editor do guia; são só para comparar.

ParaSQLiteMySQLPostgreSQLSQL Server
juntara || b, concatCONCAT(a, b); o || é OU lógico, a não ser com o modo PIPES_AS_CONCAT; e o CONCAT dá NULL se um argumento for NULLa || b, concat (ignora NULL)a + b, CONCAT
juntar com separadorconcat_wsCONCAT_WSconcat_wsCONCAT_WS
tamanho em letraslengthCHAR_LENGTH (o LENGTH do MySQL conta bytes!)length, char_lengthLEN (ignora espaços no fim)
tamanho em bytesoctet_lengthLENGTHoctet_lengthDATALENGTH
posiçãoinstr(texto, procurado)INSTR(texto, procurado) ou LOCATE(procurado, texto)strpos(texto, procurado) ou position(procurado IN texto)CHARINDEX(procurado, texto)
pedaçosubstr, substringSUBSTRING, SUBSTRsubstring(x FROM 2 FOR 3), substrSUBSTRING(x, início, n)
esquerda / direitasubstrLEFT, RIGHTleft, rightLEFT, RIGHT
completarprintfLPAD, RPADlpad, rpad—
repetir / inverter—REPEAT, REVERSErepeat, reverseREPLICATE, REVERSE
formatarformat / printf (estilo C)FORMAT(número, casas): formata números, como '12,332.1235'format com %s, %I (nome) e %L (valor)FORMAT (estilo .NET)
maiúsculas com acentosó com a extensão ICUsimsim (pelas regras do idioma do banco)sim

Experimente

Missão: o catálogo da loja precisa mostrar o preço como texto, com R$ e duas casas (R$ 1.15, R$ 12.35…). Mostre o nome de todos os produtos e o preço formatado numa coluna chamada preco_txt.

SELECT nome, preco
FROM produtos;
SELECT nome, format('R$ %.2f', preco) AS preco_txt
FROM produtos;

Livre: teste qualquer função desta página. Troque os nomes, junte funções umas dentro das outras.

SELECT nome,
       upper(substr(nome, 1, 1)) AS inicial,
       length(nome) AS letras,
       replace(nome, ' ', '_') AS sem_espacos
FROM clientes
LIMIT 5;

Resumo

  • Juntar: || (com NULL vira NULL), concat e concat_ws (pulam os NULL).
  • Medir: length em letras, octet_length em bytes.
  • Cortar e procurar: substr(x, início, n) (início 1, negativo conta do fim), instr, replace.
  • Limpar: trim, ltrim, rtrim, com ou sem a lista de letras.
  • Formatar: format / printf com %s, %d, %.2f, %05d.
  • upper, lower, LIKE e NOCASE só tratam as letras sem acento.
  • Não existem no SQLite: LEFT, RIGHT, LPAD, REPEAT, LEN; use substr e printf.