小编And*_*y M的帖子

从表中获取 JSON 列包含特定值的所有行

我正在努力从我的 PostgreSQL 数据库中的 JSON 列中获取数据。在我们的users表中,我们有一known_ips列,它是一个 JSON 列,保存给定用户已知的 IP 地址的平面数组,如下所示:

# select email, known_ips from users limit 3;
       email       |          known_ips                                     
-------------------+-------------------------------
 user1@example.com | ["192.168.1.1","192.168.1.2"]
 user2@example.com | ["192.168.1.3"]
 user3@example.com | ["192.168.1.2"]
(3 rows)
Run Code Online (Sandbox Code Playgroud)

我想要做的是从其列中的一组 IP 地址(在本例中为 192.168.1.1 或 192.168.1.2)中选择具有 IP 地址的所有用户known_ips。因此,在这种情况下,user1 和 user3 的 IP 地址为 .1 或 .2,因此我希望返回它们,而不是 user2,因为我不是在寻找 .3 地址。

我尝试了以下查询,但都无济于事:

  • database=# select email, ip from users, json_array_elements(known_ips) as ip where ip in("192.168.1.1","192.168.1.2");
    ERROR:  column "192.168.1.1" does not exist
    LINE 1: ... json_array_elements(known_ips) …
    Run Code Online (Sandbox Code Playgroud)

postgresql syntax json

6
推荐指数
1
解决办法
5283
查看次数

仅当满足所有记录的条件时选择所有记录

抱歉,如果之前已经问过这个问题。我找不到任何例子。

我试图将学生的课程作业拉出一个学期,前提是他们在所有课程中都获得了“NA”的成绩。现在,我的代码只吸引在任何课程中成绩为“NA”的学生。我需要他们在所有课程中都有“NA”,而不仅仅是 1 或 2 门课程。

我的数据:

姓名 课程 年级
学生1 en101 不适用
学生1 马101
学生1 py102 一种
学生2 en101 不适用
学生2 马205 不适用
学生2 en206 不适用
学生3 马101 不适用

我正在尝试为学生提取所有行,前提是他们在所有课程中的成绩都为“NA”。

结果应该是:

姓名 课程 年级
学生2 en101 不适用
学生2 马205 不适用
学生2 en206 不适用
学生3 马101 不适用

即使其他行不满足条件,我的代码也会提取等级为“NA”的每一行。我需要为该记录拉出所有行,只有当它满足每一行的条件时。

在我看来似乎很容易……似乎无法让它发挥作用。谢谢

sql-server sql-server-2012 relational-division

6
推荐指数
2
解决办法
824
查看次数

页眉中的 ObjID

我正在阅读这篇文章:存储引擎内部:页面剖析

我有一个数据库MyDB,数据库中有一个表MyTable

我有以下问题:

  1. 如果我这样做:

    (1) 使用以下查询查找表的对象 ID:

    Use MyDB;
    select sys.objects.name, sys.objects.object_id from sys.objects where (name = 'MyTable');
    
    Run Code Online (Sandbox Code Playgroud)

    (2) 然后使用以下命令查找分配给的所有页面MyTable

    dbcc ind(MyDB, 'MyTable', -1);
    
    Run Code Online (Sandbox Code Playgroud)

    (3)然后在结果表中,我选择其中一个数据页(页类型= 1),并使用以下命令:

    DBCC TRACEON(3604);
    DBCC PAGE (MyDB, 1, 17386, 3);
    
    Run Code Online (Sandbox Code Playgroud)

    那么在步骤(3)的转储内容(页头)中, m_objIdAllocUnitId.idObj)字段应该等于步骤(1)中获得的对象ID。那是对的吗?

    以及这是否适用于用户表和系统基表,例如sys.syscolpars基表?

    根据我的测试,以上两个结论都是正确的。

  2. 元数据:ObjectId 是什么意思?在文章中, 'metadata: objectId' <> m_objId。但是从我自己的测试来看,'metadata: objectId' 总是等于m_objId. 为什么?原始文章没有清楚地解释元数据。

我使用的是 SQL Server 2005、2008、2008 R2、2012 和 2014

sql-server metadata

5
推荐指数
1
解决办法
238
查看次数

将单个传感器值与校正因子组合成一个整体值

对于学校项目,我们试图根据 5 个传感器(3x O3、1x 温度、1x 湿度)的组合来计算(校正)臭氧值。

我们在项目的其余部分使用 MySQL 和 PHP。

该表Measurements具有以下结构:

id (int(11))
time (datetime)
value (float)
measured_value (float)
sensor (tinytext)
unit (tinytext)
measurement_short_type (tinytext)
stream_id int(11)
Run Code Online (Sandbox Code Playgroud)

所以一个示例行看起来像这样:

ID    Time                 value  measured_value  sensor  unit   measurement_short_type  stream_id
----  -------------------  -----  --------------  ------  -----  ----------------------  ---------
3324  2016-05-21 11:00:34  0      193             O3r     KOhms  O3                      6511
Run Code Online (Sandbox Code Playgroud)

如您所见,我们有 2 列,value(float) 和measured_value(float)。

为了value根据单个传感器数据(存储在 中measured_value)计算正确的最终数据,我们需要对每个数据点应用与此类似的公式:

Corrected value[datetime] = ("6511".measured_value[datetime] * -0.106830613)
                          + ("6512".measured_value[datetime] * 0.065201457)
                          + …
Run Code Online (Sandbox Code Playgroud)

mysql-5.5 datetime

5
推荐指数
1
解决办法
35
查看次数

对大表进行分区并没有提高性能,为什么?

在 SQL Server 2014 中,我每周对我的一个大表进行分区,并定义了一个滑动窗口方案,将最早一周的数据切换到存档数据库,并为下周创建一个新分区。

这是结果:

在此处输入图片说明

这是针对 AVL 系统(车辆跟踪)的。我在PositionDate ( datetime )上进行了分区。我们所有的查询在 WHERE 子句中都有PositionDate,在许多情况下,我们在 WHERE 子句中也有VehicleId。所以我在VehicleId ( int )上创建了两个对齐的索引:

  • 一对(PositionDate,VehicleId) ;
  • 一个就只是(VehicleId)

但是在其 WHERE 子句中包含VehicleId 的每个查询中,这两个非聚集索引都没有使用(根据查询计划)。

我现在有一个性能问题。

我比较了分区表和非分区表之间的查询计划,如下所示:

Select * from MyNonPart_Table Where PositionDate between '2016-05-01' AND '2016-06-01'

Select * from PartitinedTable Where PositionDate between '2016-05-01' AND '2016-06-01'
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我看到第一个查询花费了 30%,但第二个查询花费了 70%。

我有一个文件组,其中包含两个用于分区表的文件。

我的问题:

  1. 每个分区中的行数是否大于分区的最佳行数?如果我按天分区并保留最近 60 天的数据,这会帮助我提高性能吗?

  2. 我的非聚集索引是否定义明确,或者我应该删除它们?我们在所有查询的 WHERE 子句中都有PositionDate,在其中许多查询中都有VehicleId

  3. 我是否在这种情况下滥用分区?如果我在非分区表上定义良好的索引并将最旧的数据(超过 2 个月)移动到存档表,这对我的情况是否有效?

我的索引的 DDL:

ALTER …
Run Code Online (Sandbox Code Playgroud)

index sql-server partitioning

5
推荐指数
2
解决办法
2679
查看次数

累积总和的 SQL 查询

我在制定(相对)简单的 SQL 查询(使用 SQL Server 2012)时遇到问题。我们有一个数据库,可以为某些用户计算一些东西。因此,我们有一个非常简单的数据库结构,由两个表组成。

users

PK_User, uniqueidentifier
ID, bigint
Username, nvarchar(128)
CreationTimestamp, datetime
Run Code Online (Sandbox Code Playgroud)

data

PK_Data, uniqueidentifier
FK_User, uniqueidentifier
FK_Reporter, uniqueidentifier
CreationTimestamp, datetime
Run Code Online (Sandbox Code Playgroud)

我目前正在使用以下 SQL 语句:

SELECT u.Username, COUNT(d.FK_User) AS 'Count', CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime) AS 'Date'
FROM data d INNER JOIN users u ON u.PK_User = d.FK_User
GROUP BY CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime), u.Username
ORDER BY CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime)
Run Code Online (Sandbox Code Playgroud)

它提供了这样的东西:

User1   5   %Date1%
User2   3   %Date1%
User1   7   %Date2%
User2 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 sum running-totals

5
推荐指数
1
解决办法
9446
查看次数

Read Committed 不足在哪里?

维基百科说Read Committed 容易出现不可重复读取。但是,我可以简单地在我的事务中缓存第一个读取结果(制作快照)并释放数据库锁以让其他事务更新读取行。实际上,我以 RC 隔离为代价实现了重复读取,因此比可重复读取提供的性能更高。没有什么不好的事情发生,我可以像使用可重复读取隔离一样安全,对吗?不,我想对我读过的数据持有读锁可能有助于防止银行或预订预订中出现一些不良情况。哪个?

我正在寻找的是我的 RR 仿真失败的示例。我已经证明我可以通过在第一次读取访问时缓存数据项来使读取可重复。我想要一个我的模拟不够的例子。这种策略下读完立即释放锁有什么不好?

维基百科的文章和可重复阅读的名称在我看来暗示这就是我们所需要的。但我怀疑可重复读取通过使用共享锁,为了提供比简单读取一致性更重要的东西而牺牲了性能,因为后者可以通过简单的读取提交 + 缓存(快照)组合来实现。我猜读者锁在2PL 中的整个事务中持续存在,并且我们在多个读者/单作者中使用共享/读取锁,其目的不仅仅是在单个事务中提供可重复的读取,因此,Repeatable Read 是隐藏锁定事实的用词不当,它实际上牺牲了比一致性读取更大的性能。

transaction isolation-level

5
推荐指数
1
解决办法
801
查看次数

SQL Developer 建议我将聚合添加到 group by 子句

这实际上并不是一个错误,只是一个我想要一些解释的烦恼。我已经尝试过我的 Google-Fu,但我今天显然缺乏技能。

我正在使用 Oracle SQL Developer 4.1.5.21 Build MAIN-21.78 我曾经使用 2010 年的非常旧的版本(不记得版本号),并且它从未提出过这个建议,这让我感到困惑。

本质上,我有以下查询:

  SELECT
          STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg AS "Semester"
        , MIN(STDT."Application_Date") AS APP_DATE
  FROM INT_COMMENCING_APPS STDT
  WHERE 1=1
  AND STDT."Availability_Year" >= 2017
  GROUP BY STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg
Run Code Online (Sandbox Code Playgroud)

它运行良好,没有错误,并返回预期的数据。然而,甲骨文开发人员告诉我,我又蠢又错,应该去死……好吧,也许没那么糟糕。但它确实给了我一个查询提示,告诉我我错了:

SELECT list inconsistent with GROUP BY;
amend GROUP BY clause to:
          STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg
        , MIN(STDT."Application_Date")
Run Code Online (Sandbox Code Playgroud)

请注意它如何告诉我将聚合 MIN 函数添加到我的 GROUP BY 子句中,结果是什么?我已经编写 SQL 多年了,这是我第一次被告知要做这样的事情...坦率地说,我现在忽略 Oracle,因为它是个混蛋,无法礼貌地告诉我为什么。话虽这么说,如果有人有的话,我希望社区能给出解释。:)

谢谢!

编辑 2016 年 9 …

oracle oracle-sql-developer

5
推荐指数
1
解决办法
5124
查看次数

在PSQL中执行一系列命令

我正在寻找在 PSQL 中执行多个命令的解决方案。

假设我有一个数据库名称为2 的文件。

1. slave1
2. slave2
Run Code Online (Sandbox Code Playgroud)

我已经有一个名为“ master_db”的主模板。

如果我手动完成,我将执行以下操作:

CREATE DATABASE slave1 TEMPLATE master_db;
CREATE DATABASE slave2 TEMPLATE master_db;
Run Code Online (Sandbox Code Playgroud)

如果只有 2 个,那会很容易,但在我的情况下有 30 个以上,因此我想知道我们是否可以创建一个脚本。我确实尝试过搜索,但找不到解决方案。

如果这很重要,数据库在同一个集群中。

postgresql psql postgresql-9.5

5
推荐指数
1
解决办法
3508
查看次数

首字母大写,例外

我需要正确格式化一些欧洲地址。其中一个步骤是将第一个字母大写,但要避免一些特定的词,例如“on”、“on”、“von”、“van”、“di”、“in”、“sul”。因此,虽然我的技能稀缺,但我认为使用基于 RegEx 的函数是个好主意。

经过一番谷歌搜索后,我在这里找到了这个:

CREATE FUNCTION InitialCap
(
    @String nvarchar(max)
)
    RETURNS nvarchar(max)
AS
    BEGIN 
        DECLARE @Position INT;

        SELECT 
            @String   = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) COLLATE Latin1_General_Bin,
            @Position = PATINDEX('%[^A-Za-z][a-z]%',@String COLLATE Latin1_General_Bin);

        WHILE @Position > 0
            SELECT 
                @String   = STUFF(@String,@Position,2,UPPER(SUBSTRING(@String,@Position,2))) COLLATE Latin1_General_Bin,
                @Position = PATINDEX('%[^A-Za-z][a-z]%',@String COLLATE Latin1_General_Bin);

        RETURN @String;
    END
Run Code Online (Sandbox Code Playgroud)

这似乎是在寻找一个“非字母”+一个小写“字母”的序列

[^A-Za-z][a-z]
Run Code Online (Sandbox Code Playgroud)

好的,我想我已经了解它是如何工作的,并且我对其进行了修改以最好地满足我的需求。

我认为最好搜索一个空格或 ' 或 - 和一个小写字母,因此我将其更改为

[\s'-][\w]
Run Code Online (Sandbox Code Playgroud)

然后,经过多次尝试,我在 regexr.com 上构建了这个 RegEx,它似乎捕获了所需的序列:

[\s](?!di\s|in\s|sul\s|on\s|upon\s|von\s|uber\s|ueber\s)[\w]
Run Code Online (Sandbox Code Playgroud)

但是当我把它放到上面的函数中时,结果并不像预期的那样。

怎么了?

sql-server sql-server-2014 regex

5
推荐指数
2
解决办法
1599
查看次数