AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

仅使用 LIKE 运算符的大于纪元时间戳的记录

  • 772

到目前为止,我有以下查询,不幸的是,我不能使用正则表达式或大于运算符,我只能使用LIKE关键字。

整个列都在一个 json 字符串中,我不能使用json_value或正则表达式,因为我在 SQL Server 上,所以我坚持使用LIKE. 它是 SQL Server 2014,json_value直到 2016 年才受支持。

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

我想仅使用 SQLLIKE关键字(甚至使用 SQLLIKE运算符在 1645290000 和 9999999999 之间)检索纪元 unix 时间戳大于 1645290000 的所有记录。

任何帮助将不胜感激,因为这是一个非常艰难的独特案例,我仅限于使用LIKE关键字。

示例表/数据如下:

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"}') ;

这种数据可能有一千行,我唯一想要的是 update_date 大于 1645290000 的行。

在我给出的上表上运行查询应该只返回第一行,因为 2855290000 的update_date在数值上确实大于 1645290000。

sql-server sql-server-2014
  • 2 2 个回答
  • 481 Views

2 个回答

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

    我相信最好把问题分成两部分,定位到update_date,然后用">"过滤:

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

    请注意,如果您的表中存在格式错误的 JSON,则查询将失败。如果是这种情况,您可能希望将提取封装在具有错误处理的函数/过程中。

    小提琴

    或者,由于TRY_CAST是在 SQL Server 2014 中实现的,如果转换失败,则返回 null ,它永远不会满足>,所以我们可以简单地这样做:

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

    更新小提琴

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

    实际上,您不应该在没有明确 JSON 支持的 SQL Server 版本中直接处理 JSON 数据。理想情况下,JSON 源将在导入期间转换为关系格式。然后查询数据变得容易。

    也就是说,如果你真的必须按照你说的去做,有很多选择。

    一种是将(简单)JSON 转换为 XML,然后使用 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]');
    

    那里没有必要,但在每行只有一个update_date[1]的情况下会产生更好的执行计划。

    它也几乎可以LIKE专门使用,但我不推荐它:

    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<>fiddle在线演示

    如果您了解那里的LIKE逻辑,您将能够将其推广到其他值。如果您要尝试解决难题或设置某种问题,那应该可以帮助您入门。

    • 8

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve