我们正在尝试将计算列添加到表中,此操作需要 20 多个小时才能完成:
json_unquote(coalesce(json_extract(`int_data`,'$.Item.IRefNum'),
json_extract(`m_dt`,'$.refId')))
数据库:MySQL 版本 5.7
表行:32,636,254
该表已存在,其中包含数据,无法删除。
我们正在尝试将计算列添加到表中,此操作需要 20 多个小时才能完成:
json_unquote(coalesce(json_extract(`int_data`,'$.Item.IRefNum'),
json_extract(`m_dt`,'$.refId')))
数据库:MySQL 版本 5.7
表行:32,636,254
该表已存在,其中包含数据,无法删除。
我有一个逻辑,我想根据一些操作计算和显示数字。操作如下
V_CALPERCENT nvarhcar(100)
, v_yearMSA1 nvarchar(100)
,
所以我想计算V_CALPERCENT
,我有一个值v_yearMSA1 = 2
所以这是我的计算,
V_CALPERCENT := (v_yearMSA1 * 2.25) / 100
它让我回归.05
我希望它还应该显示小数点前的数字。获取方式请帮忙
我正在玩存储和索引 IP 地址。我从一个简单、愚蠢的表开始:
CREATE TABLE [dbo].[IP_addresses](
[IP_as_text] [char](16) NOT NULL,
[IP] AS ([dbo].[fnBinaryIPv4]([IP_as_text]))
) ON [PRIMARY]
fnBinaryIPv4
来自https://stackoverflow.com/questions/1385552 。_
CREATE FUNCTION dbo.fnBinaryIPv4(@ip AS VARCHAR(15)) RETURNS BINARY(4)
AS
BEGIN
DECLARE @bin AS BINARY(4)
SELECT @bin = CAST( CAST( PARSENAME( @ip, 4 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 3 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 2 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 1 ) AS INTEGER) AS BINARY(1))
RETURN @bin
END
但是,当我尝试添加PERSISTED
到IP
列或在索引中使用它时,我收到一条消息,表明它不是确定性的。我在 Google 上搜索了一下,这通常与传递给CONVERT()
日期的样式有关,但这似乎不适用于这里。 http://www.sql-server-helper.com/functions/system-functions/index.aspx说CAST()
并且PARSENAME()
是确定性的,所以我不明白为什么fnBinaryIPv4()
是不确定的。但事实证明,这PARSENAME()
曾经是确定性的,但不再是确定性的。所以我重写了那个函数:
CREATE FUNCTION [dbo].[fnBinaryIPv4](@ip AS VARCHAR(15)) RETURNS BINARY(4)
WITH SCHEMABINDING
AS
BEGIN
DECLARE @int_addr AS bigint = 0;
DECLARE @b CHAR(3);
DECLARE bCursor CURSOR FOR (
SELECT value FROM STRING_SPLIT(@ip, '.')
)
OPEN bCursor
FETCH NEXT FROM bCursor INTO @b
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @int_addr = (@int_addr * 256) + CAST(@b AS INTEGER)
FETCH NEXT FROM bCursor INTO @b
END
CLOSE bCursor
DEALLOCATE bCursor
RETURN CAST(@int_addr AS BINARY(4))
END
但是这个版本仍然是不确定的。
如何在 PostgreSQL 中刷新存储的生成列的值。
CREATE TABLE people (
first_name TEXT,
last_name TEXT
);
CREATE OR REPLACE FUNCTION name(people) RETURNS text AS
$$
SELECT $1.first_name || ' ' || $1.last_name
$$ LANGUAGE SQL STRICT
IMMUTABLE
;
alter table people add column full_name text GENERATED ALWAYS AS (name(people)) STORED;
insert into people(first_name, last_name) values('John', 'Smith');
select full_name, full_name='John Smith' as pass from people;
如果需要更改用于生成存储列值的函数,在这种情况下name
,您如何要求 postgres 重新计算这些字段。
例如。
CREATE OR REPLACE FUNCTION name(people) RETURNS text AS
$$
SELECT $1.first_name || ' ' || $1.last_name || ' function change'
$$ LANGUAGE SQL STRICT
IMMUTABLE
;
-- refresh generated column here
select full_name, full_name='John Smith function change' as pass from people;
抱歉,这是一个有点奇怪的例子。
如何更改 Postgres 12 GENERATED 列的定义?
CREATE TABLE test (
id serial PRIMARY KEY,
val_a int4 NOT NULL DEFAULT 0,
val_b int4 NOT NULL DEFAULT 0,
val_sum int4 generated always AS (val_a + val_b) stored
);
我试过了
ALTER TABLE test ALTER COLUMN val_sum TYPE int4 generated always AS (val_a + val_b + 1) stored;
ALTER TABLE test ALTER COLUMN val_sum SET generated always AS (val_a + val_b + 1) stored;
但两者都给出语法错误。
另一种方法是删除并添加列,这很有效,但我想知道如何像任何其他列一样简单地更改它。
我有一个 PostgreSQL 服务器,其现有表具有两个固定宽度非唯一字符串(可变大小)列,例如:
| ID_STRING_A | ID_STRING_B |
| 'AAAA' | 'BBBB' |
| 'BBBB' | 'CCCC' |
| 'AAAA' | 'DDDD' |
现在我想计算两个列元素的整数表示并将它们存储到其他列中。结果应如下所示:
| ID_STRING_A | ID_STRING_B | ID_INT_A | ID_INT_B |
| 'AAAA' | 'BBBB' | 1 | 2 |
| 'BBBB' | 'CCCC' | 2 | 3 |
| 'AAAA' | 'DDDD' | 1 | 4 |
我基于答案的第一个方法是:
不幸的是,尽管 ID_STRING_A/B 上有索引,但我的更新部分似乎效率很低。虽然查询本身在几分钟内完成,但更新部分似乎并未结束。这是代码:
ALTER TABLE mytable ADD COLUMN ID_INT_B integer;
ALTER TABLE mytable ADD COLUMN ID_INT_A integer;
UPDATE mytable SET ID_INT_A = g.ID_INT_A , ID_INT_B = g.ID_INT_B FROM
(
WITH T( n , s ) AS
(
SELECT ROW_NUMBER() OVER ( ORDER BY s ) , s
FROM
(
SELECT ID_STRING_A FROM mytable
UNION
SELECT ID_STRING_B FROM mytable
) AS X( s )
)
SELECT m.ctid AS id_ , m.ID_STRING_A AS ID_STRING_A , m.ID_STRING_B AS ID_STRING_B , T1.n AS ID_INT_A , T2.n AS ID_INT_B FROM mytable AS m
JOIN T AS T1 ON m.ID_STRING_A = T1.s
JOIN T AS T2 ON m.ID_STRING_B = T2.s
) AS g
WHERE mytable.ctid = g.id_
我有一个 PostgreSQL 服务器,其现有表具有固定宽度非唯一字符串列,例如:
| ID_STRING |
| 'ABCDEFG' |
| 'HIJKLMN' |
现在我想计算每个元素的整数 id 并将它们存储到一个附加列中。结果应如下所示:
| ID_STRING | ID_INT
| 'ABCDEFG' | 1
| 'HIJKLMN' | 2
| 'ABCDEFG' | 1
| 'HIJKLMN' | 2
有没有简单的方法来实现这一目标?
我有一个包含复杂列的查询,我想将此列结果用于另一列,例如:
SELECT ( /* Complex query */ ) as myValue, if( myValue > 10, "OK" , "" ) from table;
但他的查询返回错误:
Error Code: 1054. Unknown column 'myValue' in 'field list
如何重用已计算的字段?
我在 CentOS 7 上运行以下版本的 Postgres:
PostgreSQL 9.6.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64-bit
我是数据库操作的新手,需要一些帮助来了解我是否应该/如何执行以下操作:
我有一个包含三列数据的表“Table1”:
| timestamp | Value1 | Value2 |
Value1 和 Value2 列包含十进制值,如下所示:
| 1.6732 | 2.78093 |
我在这个表中有大约一百万行数据。
我希望能够从 Value2 中减去 Value1 并将此计算的结果插入到同一个表的新列中,以便该表永久存储计算值并最终如下所示。
timestamp | Value1 | Value2 | Value3
我不确定我是否可以或应该这样做,如果可能的话,我将如何创建一个查询来实现这一点。
请任何人都可以就我应该如何做这件事或指出我如何自己学习做这件事的正确方向提供任何建议、例子或指示?
谢谢...
PostgreSQL 是否支持生成的列?也称为虚拟列。我不是在谈论IDENTITY
专栏。
我找不到关于这个非凡特性的任何信息,但我知道它可以在 SQL Server 以及最新版本的 MariaDB 和 MySQL 中使用。
SQL:2003标准中提到了该功能,并且在 2006 年左右在 PostgreSQL 论坛上进行了一些讨论,但我找不到任何实质性的内容。
有一些关于 SO 的讨论,但它现在已经很老了,所以它很可能已经过时了。