我正在重构一些旧代码并偶然发现了这个命名查询(它在 mysql 之上使用 hibernate):
delete F from
foo F
inner join user DU on F.user_id = DU.id
where
(COALESCE(:userAlternateId,null) is null or DU.alternate_id like :userAlternateId )
and ( COALESCE(:fooId,null) is null or F.foo_id like :fooId )
and (
( COALESCE(:fromUpdated,null) is null or F.updated_at>=:fromUpdated )
and ( COALESCE(:toUpdated,null) is null or F.updated_at<=:toUpdated )
)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么COALESCE要以这种方式使用它:
COALESCE(:userAlternateId,null) is null
这是性能黑客还是它使查询数据库独立还是......?
顺便说一句userAlternateId,是字符串/varchar,其他 id 是长整型和from-to日期
我有一个正在尝试针对 PostgreSQL 9.2 进行优化的查询:
select coalesce(max(id),0) as m from tbl
Run Code Online (Sandbox Code Playgroud)
它需要永远运行,所以我想我可以将其重写为
select id from tbl order by id desc limit 1
Run Code Online (Sandbox Code Playgroud)
0但如果表中没有行则需要返回。我尝试了几种 case 语句的组合,但它们似乎不起作用。有什么建议么?
计划空表:
Aggregate (cost=11.25..11.26 rows=1 width=4)
-> Seq Scan on tbl (cost=0.00..11.00 rows=100 width=4)
Run Code Online (Sandbox Code Playgroud)
具有 1,190,000 行的表的成本为 58k,但执行计划相同。
postgresql coalesce aggregate-functions postgresql-9.2 postgresql-performance
我遇到了 MySQL 的 ROLLUP 和处理结果 NULL 的问题。IFNULL/COALESCE 函数适用于普通列,但在与日期函数一起使用时似乎会崩溃。示例如下:
SELECT
YEAR(date_time) AS Year,
count(x) AS Count
FROM mytable
GROUP BY year WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)
回报(如预期)
Year Count
---- -----
2015 3
2016 2
NULL 5
Run Code Online (Sandbox Code Playgroud)
当我查询非日期列(例如 varchar)时,我可以使用 IFNULL 或 COALESCE 函数将 NULL 值替换为字符串来处理 NULL 值。但是,当我将相同的逻辑应用于上述查询时,它似乎不起作用。
SELECT
COALESCE(YEAR(date_time), 'moo') AS Year,
count(x) AS Count
FROM mytable
GROUP BY year WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)
或者
SELECT
IFNULL(YEAR(date_time), 'moo') AS 'year',
count(x) AS Count
FROM mytable
GROUP BY year WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)
回报
Year Count
---- -----
2015 …Run Code Online (Sandbox Code Playgroud) 我有两个表 feed_old(默认数据)和 feed_new(新数据),其中 cron 作业将每天运行,并仅使用当前信息更新 feed_new 表
定时任务
$url = "localhost/test.xml";
$xml = simplexml_load_file($url);
$this->db->query("TRUNCATE TABLE feed_new");
$date = date('Y-m-d H:i:s');
foreach($xml->Product as $item)
{
$data = array(
'product_code' => $item->ProductCode,
'name' => $item->Name,
'price' => $item->RetailCurrentPrice,
'stock' => (int)$item->Stock,
'manufacture' => '1',
'date_updated' => $date
);
$update_status = $this->model_price->check_price($data);
}
Run Code Online (Sandbox Code Playgroud)
模型
public function check_price($data)
{
if($data) {
$insert = $this->db->insert('feed_new', $data);
return ($insert == true) ? true : false;
}
}
Run Code Online (Sandbox Code Playgroud)
从这里开始一切正常
当我比较 feed_new 与 feed_old 并获得任何更改并显示所有记录时,问题就来了
在比较 feed_new …
我有一个像这样的数据框:
stage1 stage2 stage3 stage4
a NA b c
NA d NA e
NA NA f g
NA NA NA h
Run Code Online (Sandbox Code Playgroud)
其中每一列都是流程的一个阶段。我想要做的是根据前面的列合并每一列:
stage1 stage2 stage3 stage4
a a a a
NA d d d
NA NA f f
NA NA NA h
Run Code Online (Sandbox Code Playgroud)
实际值并不重要,这也可能是一个逻辑数据帧,其中输出的每个字符串是TRUE,每个 NA 是FALSE。
我编写了这个函数,可以让我合并选择的列:
coacross <- function(...) {
coalesce(!!!across(...))
}
df <- df %>%
mutate(total_stages = coacross(everything()))
Run Code Online (Sandbox Code Playgroud)
这基本上创建了stage4我想要的输出列。有什么方法可以迭代运行这个,最好没有 for 循环?stage2那么我可以对和做同样的事情stage3吗?否则,还有其他方法可以做到这一点吗?
多谢。
编辑:
这有效:
for(col in names(df %>% select(-stage1))){ …Run Code Online (Sandbox Code Playgroud) 我不久前发布了类似的问题,现在我需要更新此代码,我回来问一个后续问题.上一个问题在这里:
基于可空列的计算列
我的数据(Address1, Address2, City, State, Zip, Country)可能包含不完整的信息.即我不能保证除了State和Country列之外的任何东西都有数据.
我想有一个计算列FullAddress.
以前,我使用过COALESCE,如果填写了所有字段,那么效果很好.现在,随着数据要求的放宽,这已不再是一个选项(因为我们以重复的逗号结尾FullAddress).这是我以前使用的(注意,我只是在这里使用SELECT语句以方便使用 - 一旦我有适用于所有情况的东西,将转换为计算列"alter table add"语句):
SELECT (((((COALESCE([Address1],'')
+ COALESCE(', '+[Address2],''))
+ COALESCE(', '+[City],''))
+ COALESCE(', '+[State],''))
+ COALESCE(', '+[Zip],''))
+ COALESCE(', '+[Country],'')) AS FullAddress
FROM Locations
Run Code Online (Sandbox Code Playgroud)
现在,我已经使用了一个替代方法CASE,但它仍然不适用于边缘情况Address1 is NULL(问题是FullAddress它将具有','作为前两个字符)
SELECT CASE WHEN [Address1] IS NOT NULL THEN [Address1] ELSE '' END
+ CASE WHEN [Address2] IS NOT NULL THEN ', ' …Run Code Online (Sandbox Code Playgroud) 我想选择多个按钮并按顺序点击第一个按钮.像COALESCE功能一样的东西.
我试过这个:
$(".selector1, .selector2, .selector3").first().click();
Run Code Online (Sandbox Code Playgroud)
这可以工作,但选择遵循DOM顺序而不是我的选择器查询顺序.有什么建议吗?
我试图找到ANSI方式来编写T-SQL"IS NULL".(更正,是'IN NULL')互联网上的一些帖子说你可以使用coalesce让它像'IS NULL'一样工作
我喜欢这样做的原因:便携式代码.并且查询必须返回行NULL.
到目前为止我创建了这个:
SELECT empid,
firstname,
lastname,
country,
coalesce(region,'unknown') AS regions ,
city
FROM HR.Employees
Run Code Online (Sandbox Code Playgroud)
结果集如下所示:
empid firstname lastname country regions city
1 Sara Davis USA WA Seattle
2 Don Funk USA WA Tacoma
3 Judy Lew USA WA Kirkland
4 Yael Peled USA WA Redmond
5 Sven Buck UK unknown London
6 Paul Suurs UK unknown London
7 Russell King UK unknown London
8 Maria Cameron USA WA Seattle
9 Zoya Dolgopyatova UK unknown …Run Code Online (Sandbox Code Playgroud) 以下查询运行正常,但我想输入一个选项,如果返回的电子邮件是NULL,那么我输入"example@google.com"或类似的东西.我已经阅读了一些函数,比如说COALESCE(EMAIL,"example@google.com"),但我不确定该函数在脚本中的位置.你能指点一下我应该在哪里注入这个功能吗?我是否正朝着正确的方向前进?谢谢.
SELECT LCASE(LOGIN_NAME) as uniqueid, CONCAT('sha-512:', PASSWD) as password, REPLACE(CONTACT_NAME, '"', '') as name, \
CONCAT('unit,', \
MAX(CASE WHEN USER_TYPE = 'custom' THEN \
'location_employee' \
WHEN (LOGIN_NAME != 'link' AND USER_TYPE = 'owner' AND (UA.PARTY_SITE_ID IS NULL OR NOT EXISTS (SELECT U2.ID FROM CUSTOMER_DATA.USER_ACCESS U2 WHERE U2.USER_ID=U.ID AND (U2.PARTY_SITE_ID IS NULL OR U2.PARTY_SITE_ID = '')) ) )THEN \
'master' \
ELSE \
'location' \
END)) AS role, \
MAX(EMAIL) as email, \
MAX(PHONE) as phone, \
MAX(FAX) …Run Code Online (Sandbox Code Playgroud) 我希望第二个查询的结果覆盖第一个查询的结果:
SELECT "panel_restaurants_restaurant"."id",
"panel_restaurants_restaurant"."name",
"panel_restaurants_restaurant"."logo",
"panel_restaurants_restaurantfeatures"."currency" AS "currency",
ST_DistanceSphere(location, ST_GeomFromText('POINT(0.0 0.0)',4326)) AS "distance",
"panel_meals_meal"."id" AS "meal_id",
"panel_meals_meal"."status" AS "meal_status",
"panel_meals_meal"."available_count" AS "available_dishes",
"panel_meals_meal"."discount_price" AS "discount_price",
"panel_meals_meal"."normal_price" AS "normal_price",
"panel_meals_meal"."collection_from" AS "pickup_from",
"panel_meals_meal"."collection_to" AS "pickup_to",
"panel_meals_meal"."description" AS "meal_description"
FROM "panel_restaurants_restaurant"
INNER JOIN "panel_restaurants_restaurantfeatures" ON (
"panel_restaurants_restaurantfeatures"."restaurant_id" = "panel_restaurants_restaurant"."id")
LEFT OUTER JOIN "panel_meals_meal" ON ("panel_restaurants_restaurant"."id" = "panel_meals_meal"."restaurant_id"
AND "panel_meals_meal"."status" = 0
AND (
("panel_meals_meal"."collection_from" AT TIME ZONE 'Europe/Warsaw')::date = DATE 'today' OR
("panel_meals_meal"."collection_from" AT TIME ZONE 'Europe/Warsaw')::date = DATE 'tomorrow'
)
AND …Run Code Online (Sandbox Code Playgroud)