Na minha tabela eu tenho um campo (digamos cert_attr
) que armazena Certificate X.509 Attributes .
Aqui está o exemplo de 3 linhas (cada linha corresponde a um campo):
"CN=User1, OU=Eng, O=Company Ltd, L=D4, S=Dublin, C=IE"
"CN=User2, OU=Eng, O=Company Ltd, L=D2, S=Dublin, C=IE"
"OU=Eng, O=Company Ltd"
E estou tentando dividir o valor de um campo em colunas separadas usando SELECT
da seguinte maneira:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "CN=", -1), ", ", 1) as CN,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "OU=", -1), ", ", 1) as OU,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "O=", -1), ", ", 1) as O,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "L=", -1), ", ", 1) as L,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "ST=", -1), ", ", 1) as ST,
SUBSTRING_INDEX(SUBSTRING_INDEX(cert_attr, "C=", -1), ", ", 1) as C
FROM mytable
que funciona, no entanto, há um problema para as linhas que estão faltando alguns atributos.
Portanto, no caso em que o atributo está ausente na string do campo, espero que a coluna esteja vazia, mas ela retorna a string inteira.
Os dois primeiros exemplos de linha estão funcionando conforme o esperado, o que retorna as seguintes colunas corretamente:
| CN | OU | O | L | S. | C |
| ----- | --- | ----------- | -- | ------ | -- |
| User1 | Eng | Company Ltd | D4 | Dublin | IE |
| User2 | Eng | Company Ltd | D2 | Dublin | IE |
O problema está no exemplo da 3ª linha, que espero retornar uma string vazia quando o padrão de substring não for encontrado:
| CN | OU | O | L | S. | C |
| ---------- | --- | ----------- | ---------- | ---------- | ---------- |
| OU=Eng,... | Eng | Company Ltd | OU=Eng,... | OU=Eng,... | OU=Eng,... |
mas em vez disso, a string inteira é retornada.
Pergunta:
Existe alguma maneira de retornar uma string vazia quando SUBSTRING_INDEX()
não consegue encontrar a substring? Ou talvez haja alguma outra função (como uma expressão regular) ou outra solução alternativa?
Meu objetivo é extrair os dados para o arquivo TSV tendo esses atributos em colunas separadas com valores válidos:
mysql mytable < query.sql > cert_attributes.tsv
A primeira parte é apenas para mostrar que o procedimento funciona
db<>fique aqui
O procedimento armazenado completo, incluindo a produção do arquivo tsv
Arquivo tsv de resultado
Você deve verificar a pasta INTO OUTFILE, que deve corresponder à entrada no arquivo my.ini/cnf