我正在尝试理解UVim 中的命令。我的理解是,它会撤消仅影响最近更改的行的所有更改。但是,如果我从以下文件开始:
abc
def
ghi
Run Code Online (Sandbox Code Playgroud)
jxx向下导航并删除两个字符:
abc
f
ghi
Run Code Online (Sandbox Code Playgroud)
kgU2j将整个文档设置为大写:
ABC
F
GHI
Run Code Online (Sandbox Code Playgroud)
现在,U给出这个结果:
ABC
def
GHI
Run Code Online (Sandbox Code Playgroud)
如果我习惯kd2j删除整个文档而不是更改其大小写,U则不会有任何效果。我想知道为什么d被视为影响多行的命令,但gU似乎被忽略了。
是否有一种直观的方法来理解这种行为,或者这只是 Vim 的一个奇怪的边缘情况?
假设我有一个带有多个键的变体字段,在查询元数据表之前,我不知道哪个键会给我我关心的值。这是一个简化和人为的示例:
create table KEY_LOOKUP (
key_name text,
is_useful boolean
);
insert into KEY_LOOKUP values
('A', True),
('B', False);
create table DATA (
key_values variant
);
insert into DATA
select PARSE_JSON('{"A": "Useful Value", "B": "Useless Value"}');
Run Code Online (Sandbox Code Playgroud)
该DATA表现在包含两个键,其中一个会给我我想要的值,而其中一个没有用。如果我事先知道这A是我需要的密钥,我可以简单地select key_values:A,但如果我事先不知道,我必须先查询KEY_LOOKUP。
如果我想编写一个始终使用适当键的查询,我可以展平表并像这样提取相关值:
select b.value from DATA a, lateral flatten(input => a.key_values) b
where b.key in
(select key_name from KEY_LOOKUP
where is_useful);
Run Code Online (Sandbox Code Playgroud)
但这有几个缺点。它很慢,语法冗长且(对我而言)不直观,并且在表展平后处理聚合很尴尬,尤其是当我为多个键执行此操作时。
理想情况下,我很想写这样的东西:
select key_values:{select key_name from KEY_LOOKUP where is_useful}
from DATA
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法?