AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 313750
Accepted
Elite298
Elite298
Asked: 2022-06-25 12:56:35 +0800 CST2022-06-25 12:56:35 +0800 CST 2022-06-25 12:56:35 +0800 CST

Registros maiores que o timestamp de época usando apenas o operador LIKE

  • 772

Tenho a seguinte query até o momento e infelizmente não consigo usar operadores regexp ou maior que , só consigo usar a LIKEpalavra chave.

A coluna inteira está em uma string json, não posso usar json_valueou regexp porque estou no SQL Server, então estou preso ao uso do LIKE. É o SQL Server 2014 e json_valuenão tem suporte até 2016.

SELECT * FROM DataTableOne 
WHERE update_date LIKE '%1645290000%'

Eu gostaria de recuperar todos os registros onde o timestamp unix do epoch é maior que 1645290000 usando apenas a LIKEpalavra-chave SQL (ou mesmo entre 1645290000 e 9999999999 usando o LIKEoperador SQL).

Qualquer ajuda será muito apreciada, pois este é um caso único muito difícil em que estou limitado a usar apenas a palavra- LIKEchave.

Exemplo de tabela/dados abaixo:

CREATE TABLE DataTableOne (
    ID int,
    DATA varchar(MAX)
);

INSERT INTO DataTableOne (ID, DATA)
VALUES (1, '{"name":"Cole", "update_date":"2855290000"}'),
(2, '{"name":"Peter", "update_date":"1222290000"}') ;

Pode haver mil linhas com esse tipo de dados e as únicas que eu quero são aquelas em que o update_date é maior que 1645290000.

A execução da consulta na tabela acima que dei deve retornar apenas a primeira linha, pois a data_de_atualização de 2855290000 é realmente maior que 1645290000 numericamente.

sql-server sql-server-2014
  • 2 2 respostas
  • 481 Views

2 respostas

  • Voted
  1. Lennart - Slava Ukraini
    2022-06-25T22:25:55+08:002022-06-25T22:25:55+08:00

    Acredito que seja melhor separar o problema em duas partes, localize o update_date e depois use ">" para filtrar:

    select * from DataTableOne
    where cast ( substring( data
               , charindex('"update_date":', data)+15
               , len(data)- (charindex('"update_date":', data)+15) -1 )
          as bigint ) > 1645290000
    

    Observe que, se houver JSON malformado em sua tabela, a consulta falhará. Se for esse o caso, você pode querer encapsular a extração em uma função/procedimento com tratamento de erros.

    violino

    Ou, como TRY_CASTé implementado no SQL Server 2014, se o cast falhar, null é retornado, o que nunca satisfaz >, então podemos simplesmente fazer:

    select * from DataTableOne
    where TRY_CAST ( substring( data
               , charindex('"update_date":', data)+15
               , len(data)- (charindex('"update_date":', data)+15) -1 )
             as bigint ) > 1645290000;
    

    violino atualizado

    • 9
  2. Best Answer
    Paul White
    2022-06-26T01:28:49+08:002022-06-26T01:28:49+08:00

    Realisticamente, você não deve trabalhar diretamente em dados JSON em versões do SQL Server sem suporte explícito a JSON. Idealmente, a origem JSON seria transformada em um formato relacional durante a importação. Consultar os dados torna-se então fácil.

    Dito isto, se você realmente deve fazer o que diz, há várias opções.

    Uma é converter o JSON (simples) para XML e usar XQuery:

    SELECT
        DTO.*
    FROM dbo.DataTableOne AS DTO
    CROSS APPLY 
    (
        SELECT 
            TRY_CONVERT(xml,
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(DTO.[DATA], 
                                '"name":', 'name='),
                            ', "update_date":', ' update_date='),
                        '{', '<r '),
                    '}', '/>'))
    ) AS X (x)
    WHERE
        1 = X.x.exist('r[1][@update_date ge 1645290000]');
    

    O [1]não é necessário, mas produz um plano de execução um pouco melhor no caso de haver apenas um update_date por linha.

    Também é quase possível usar LIKEexclusivamente, mas eu não recomendaria:

    SELECT * 
    FROM dbo.DataTableOne AS DTO
    WHERE 
        DTO.[DATA] COLLATE Latin1_General_BIN2 
            LIKE '%"update_date":"164529[0-9][0-9][0-9][0-9]"%'
        OR DTO.[DATA] COLLATE Latin1_General_BIN2 
            LIKE '%"update_date":"1645[3-9][0-9][0-9][0-9][0-9][0-9]"%'
        OR DTO.[DATA] COLLATE Latin1_General_BIN2 
            LIKE '%"update_date":"164[6-9][0-9][0-9][0-9][0-9][0-9][0-9]"%'
        OR DTO.[DATA] COLLATE Latin1_General_BIN2 
            LIKE '%"update_date":"16[5-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"%'
        OR DTO.[DATA] COLLATE Latin1_General_BIN2 
            LIKE '%"update_date":"1[7-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"%'
        OR DTO.[DATA] COLLATE Latin1_General_BIN2 
            LIKE '%"update_date":"[2-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"%';
    

    db<> demonstração online de violino

    Se você entender a LIKElógica, poderá generalizá-la para outros valores. Isso deve começar se você estiver tentando resolver um quebra-cabeça ou definir algum tipo de questão.

    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve