通常,函数标记是普通标识符 ( [A-z_][0-9A-z_]*
) 或其某种变体。是否有任何语言支持包含空格的带引号的函数名称?例如:
`my function`(x,y,z) # using back-tick quoting
通常,函数标记是普通标识符 ( [A-z_][0-9A-z_]*
) 或其某种变体。是否有任何语言支持包含空格的带引号的函数名称?例如:
`my function`(x,y,z) # using back-tick quoting
标记_123jh
和123jh
导致大多数词法分析器不包含以数字开头的标识符之间的区别是什么?我猜一个原因可能是纯数字标记可能会造成混淆,因此完全消除前导数字比允许类似以下内容更容易:
^(\d+[A-z_][A-z_0-9]*|[_A-z][A-z0-9]*)$
。
或者还有其他原因(也许词法分析器无法保证以这种方式进行单字符前瞻)?
我有一个类似的查询:
select *
from combined
where valid_rating is null
order by FIND_IN_SET(provider,
(select provider
from combined
where valid_rating is null group by provider order by count(1) desc)
)
基本上,我试图先按“最重要的”排序provider
(项目数最多的)。我该如何使用order_by
子句中的表达式正确地做到这一点,甚至可能使用窗口函数?
假设我有两个表(来自上传的 csv 文件),我想根据新文件中的 id+territory 进行差异分析,而旧文件中没有。最简单的方法是:
SELECT id, territory FROM this_week EXCEPT SELECT id, territory FROM last_week
但是,我试图获取由该差异生成的所有字段(在两个表中 - 每个键一行)。如何做到这一点?
postgres 或 bigquery 都可以。两者都有EXCEPT
set op。
来自 Erwin 答案的数据示例:
WITH this_week (id,territory,name,other) AS (VALUES(1,'us','titanic','uhd'),(22,'us','spider','hd'),(3,'fr','new','hd')),
last_week (id,territory,name,other) AS (VALUES(1,'us','titanic','uhd'),(2,'us','spider','hd'))
SELECT * -- all columns of "this_week"
FROM this_week t
WHERE NOT EXISTS (
SELECT * FROM last_week l
WHERE t.id = l.id
AND t.territory = l.territory
);
为了方便调试,我经常添加一个错误的谓词,如下所示:
SELECT ...
WHERE 1=1
AND/OR predicate1
AND/OR predicate2
...etc
这样,我可以注释掉一行或多行,而我的查询仍然有效。有没有办法1=1
对 执行等效操作ORDER BY
?例如,??
在以下内容中填写:
SELECT ...
WHERE ...
ORDER BY ???,
sort1,
sort2,
...
我相信几乎所有主流数据库引擎都会进行优化,但我想知道对于故意虚假的1=1
它是否会做同样的事情?ORDER BY
我需要调试一些遗留代码,并且只想将一些信息打印到不会干扰代码库中任何其他位置的文件中。到目前为止,我发现的最粗暴的方法是这样的:
def my_func():
f = open('/tmp/log.txt', 'a') # help with logging stuff
f.write('Here is my crude local logger.')
# some code
logger.log('Hello') # our 'Normal logger' that goes to Splunk
# so I don't think I can modify this
# safely without side-effects?
但是,我喜欢日志模块添加的所有“额外”内容,例如行号、时间、功能等。添加本地记录器来执行普通记录器可以执行的操作的最佳方法是什么?
我正在使用以下值模拟 SQL 查询:
rows = [(1, '2021/04', 'Shop 2', 341227.53), (2, '2021/05', 'Shop 2', 315447.24), (3, '2021/06', 'Shop 1', 1845662.35), (4, '2021/04', 'Shop 2', 21487.63), (5, '2021/05', 'Shop 1', 1489774.16), (6, '2021/06', 'Shop 1', 52489.35), (7, '2021/04', 'Shop 1', 154552.82), (8, '2021/05', 'Shop 2', 6548.49), (9, '2021/06', 'Shop 2', 387779.49)]
我想建立一个“窗口”函数的字典。它应该在第三列(前值:“shop1”)上进行分区,并按第二列(前值:“2021/06”)排序。
所以,它应该看起来像这样:
{
'Shop 1': ['2021/04', '2021/05', ...],
'Shop 2': [...],
...
}
有没有办法做到这一点,这样我就可以定义一个带有两个参数的 lambda 函数,例如:
window_func = lambda partition_func, order_func: ...
上面的partition_func
内容是item[2]
, order_func 是item[3]
。
假设我有下表:
CREATE or replace TABLE t (id INT, content STRING, rowid INT);
INSERT INTO t VALUES (42, 'hello', 5), (43, 'world', 5);
如何获取数据库中的rowid
伪列和实际列?rowid
例如,做类似的事情:
select id, content, rowid, ?rowid-pseudocolumn?
from t;
参考: https: //docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm
另外,一般来说,如果存在“影子列”,如果存在同名用户列,是否有任何程序可以检索该列?
我有以下两个表来提供每个用户拥有的文件路径:
create temp table object as (
select 1 id, 'MyFile1' name union all
select 2 id, 'MyFile2' name union all
select 3 id, 'MyFolder' name union all
select 4 id, 'SomeFile' name union all
select 5 id, 'Hello' name
);
create temp table path as (
select 1 user_id, 1 object_id, NULL parent_folder union all
select 1 user_id, 2 object_id, NULL parent_folder union all
select 1 user_id, 3 object_id, NULL parent_folder union all
select 1 user_id, 4 object_id, 3 parent_folder union all
select 2 user_id, 5 object_id, NULL parent_folder union all
select 2 user_id, 1 object_id, NULL parent_folder
);
例如,对于 user-1,他的目录结构如下所示:
MyFile1
MyFile2
MyFolder/
SomeFile
我正在尝试构建一个递归 cte,以便它显示用户及其路径。以下是查询应返回的内容:
user_id path
1 MyFile1
1 MyFile2
1 MyFolder
1 MyFolder/SomeFile
2 Hello
2 MyFile1
我目前有以下工作查询,但想知道是否可以在可读性或性能方面改进它:
create temp table object as (
select 1 id, 'MyFile1' name union all
select 2 id, 'MyFile2' name union all
select 3 id, 'MyFolder' name union all
select 4 id, 'SomeFile' name union all
select 5 id, 'Hello' name
);
create temp table path as (
select 1 user_id, 1 object_id, NULL parent_folder union all
select 1 user_id, 2 object_id, NULL parent_folder union all
select 1 user_id, 3 object_id, NULL parent_folder union all
select 1 user_id, 4 object_id, 3 parent_folder union all
select 2 user_id, 5 object_id, NULL parent_folder union all
select 2 user_id, 1 object_id, NULL parent_folder
);
WITH RECURSIVE all_paths AS (
SELECT user_id, id, name AS path FROM path JOIN object ON path.object_id=object.id WHERE parent_folder IS NULL
UNION ALL
SELECT all_paths.user_id, null, CONCAT(all_paths.path, '/', object.name)
FROM all_paths JOIN path ON all_paths.id = path.parent_folder join object ON path.object_id=object.id
) SELECT * FROM all_paths ORDER BY user_id, path