相关疑难解决方法(0)

如果列存在,如何选择特定行,如果列不存在,如何选择所有行

我正在编写一个脚本来获取几个表的行数,但是对于某些表,我只想获取设置了标志的行数(在这种情况下为 active=1)。有没有一种方法可以在一个查询中做到这一点?

例如:

users有一个名为 active 的列

clients没有名为 active 的列

我想获取 active=1 的用户数,并获取客户端数。

在你说“只是硬编码它”之前,这是一个在 python 脚本中的查询,该脚本可以在许多不同的数据库上运行,我无法知道我的脚本将选择哪些表,以及它们是否有一个名为 的列active,以及我宁愿只用一个查询来完成所有工作,而不是两个单独的查询并依靠 mysql 抛出错误,所以我知道使用另一个查询。

mysql count select

24
推荐指数
1
解决办法
2万
查看次数

如何在 Sql Server 中编写统计数据?(使用 T-SQL)

这里有一个非常相似的问题:

为统计创建 SQL 脚本

但这不是我想要的。

我想完全取回我输入的内容。例如:

CREATE STATISTICS [_MM_STATS__745366020_7_1_4_5_2_3] 
ON [dbo].[ProductShipTax]
([TaxRegionId], [ProductShipTaxID], [TaxRate], [ItemNo], [DateFrom], [DateTo])
Run Code Online (Sandbox Code Playgroud)

我想要一个查询,它可以让我获得上面的确切脚本,以便我可以将它应用到不同的数据库。

这可能吗?

sql-server statistics metadata sql-server-2014

8
推荐指数
1
解决办法
9759
查看次数

对于与外部查询中同名的不存在的列,子查询不会出错

我在 MySQL 数据库中有两个表 -t1一个列c1t2一个列c2

我运行这个查询:

select * from t1 where c1 in (select c1 from t2);
Run Code Online (Sandbox Code Playgroud)

上面的查询应该给出一个错误,因为c1t2 中不存在。相反,它返回t1. 上述查询的另一个版本delete可能会造成更大的灾难:

delete from t1 where c1 in (select c1 from t2);
Run Code Online (Sandbox Code Playgroud)

当上面的查询只是应该给出错误时,它会删除 t1 中的所有行。

我注意到只有当子查询中的列与外部列具有相同的名称时才会发生这种行为。意义,

select * from t1 where c1 in (select c3 from t2);
Run Code Online (Sandbox Code Playgroud)

将按预期抛出错误:

 ERROR 1054 (42S22): Unknown column 'c3' in 'field list'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我已经在 PostgreSQL 9.6.3 上检查过同样的问题,行为完全相同。对这种奇怪的行为有什么解释吗?

subquery

7
推荐指数
2
解决办法
1792
查看次数

如果列存在则条件 WHERE

我有几个表,通常具有可为空的“CreatedDate”和/或“ModifiedDate”日期时间列。我想要一个查询,可以从任何单个表中进行选择,其中一个、两个或都不存在日期时间列,并且每列都BETWEEN提供(单独的)范围。

这是一个粗略的(非工作的)示例。这尝试用来COL_LENGTH确定列是否存在。但是,如果一列不存在,则会引发错误,我相信是因为WHERE仍在评估整个列。

SELECT * FROM tableName
WHERE 1=1 AND
(COL_LENGTH(tableName, 'CreatedDate') IS NULL OR CreatedDate BETWEEN @CreatedFrom AND @CreatedTo) AND
(COL_LENGTH(tableName, 'ModifiedDate') IS NULL OR ModifiedDate BETWEEN @ModifiedFrom AND @ModifiedTo)
Run Code Online (Sandbox Code Playgroud)

这可以通过动态 SQL 来解决。但是,在这种情况下,我仅限于以读取为中心的权限。所以没有 EXEC、CREATE 或 INSERT。

这可以用静态 SQL 实现吗?

示例表

两列:

DECLARE @Table1 table
(
    Id int NOT NULL,
    CreatedDate datetime NULL,
    ModifiedDate datetime NULL
);

INSERT @Table1
    (Id, CreatedDate, ModifiedDate)
VALUES
    (1, NULL, NULL),
    (2, NULL, '20230101 01:23:45.678'),
    (3, '20230101 02:34:56.789', NULL),
    (4, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

2
推荐指数
1
解决办法
1121
查看次数