Mysql 每个搜索项显示一行,如果未找到,则替换默认值
查询: 输出:Mysql 每个搜索项显示一行,如果未找到,则替换默认值,mysql,postgresql,Mysql,Postgresql,查询: 输出: SELECT product_id, name FROM product WHERE barcode in (681027, 8901030349379, 679046, 679047, 679082, 679228, 679230, 679235, 679236, 679238,
SELECT product_id,
name
FROM product
WHERE barcode in (681027, 8901030349379,
679046, 679047,
679082, 679228,
679230, 679235,
679236, 679238,
679328, 679330,
679528, 679608,
679609, 679647,
679727, 679728,
679730, 679808,
679809, 679828, 679830)
如果没有特定条形码的行,如何显示?在sql中的语句中使用是否是一种良好的做法
我使用PostgreSQL 8.2.11。这可能有用:
YES -IF PRODUCT NAME IS PRESENT
NO -IF PRODUCT NAME IS NOT PRESENT
NO
YES
YES
NO
...
在union
中放置所有要检查的条形码
Aded:
它返回两列以匹配条形码和应答,因为除非指定一列,否则无法按行顺序进行中继。自PostgreSQL 8.4以来
使用和左连接:
select case when p.name is null then 'NO' else 'YES' end as barcode_exists, t.barcode
from product as p
right join (
select 681027 as barcode union
select 8901030349379 union
select 679046 union
select 679047 union
select 679082 union
select 679228 union
select 679230 union
select 679235 union
select 679236 union
select 679238 union
select 679328 union
select 679330 union
select 679528 union
select 679608
-- all the rest barcodes
) as t on p.barcode = t.barcode
每个数组元素生成一行。它是在PostgreSQL 8.4中引入的。
确保显示每个条形码
,即使找不到匹配的产品
请注意,“缺少”产品名称可能有两个原因(NULL
):
找不到匹配的产品。条形码
找到了product.barcode
,但随之而来的product.name
为NULL
如果您没有产品
,则可能需要在表中的名称
列中添加非空
约束
PostgreSQL 8.3
使用:
请注意,在单独的行上列出的字符串是如何自动连接的。一个不太出名的标准SQL特性
PostgreSQL 8.2
目前还不存在任何集合生成函数考虑升级到更新的版本!PostgreSQL 8.2正在普及
通用解决方案适用于任意数量的条形码(对于非常大数量的条形码,速度较慢):
或链选择s与UNION ALL
:
SELECT x.barcode
, p.product_id
, CASE WHEN p.name IS NULL THEN 'NO' ELSE 'YES' END AS product_name_exists
FROM (
SELECT a[i] AS barcode
FROM (
SELECT a.a, generate_series(1, array_upper(a.a, 1)) AS i
FROM (
SELECT '{679046,679047,679082,679228,679230,679235,679236,'
'679238,679328,679330,679528,679608,679609,679647,'
'679727,679728,679730,679808,679809,679828,679830}'::text[] AS a
) a
) i
) x
LEFT JOIN product USING (barcode);
使用UNION ALL
,而不是UNION
。您不想尝试消除每个添加条形码的重复项。这对于大数字来说是很慢的。相关的:
这里的许多人会告诉你不要在
中使用,但事实是,许多数据库管理系统,包括最新版本的MySQL,已经将
中的自动转换为
存在
。如果对你想要的结果没有更清晰的了解,我们很难帮助你。“这对我有用”-这不会显示带有条形码的产品。因此,它也不完全符合要求的“输出”,但由您决定什么对您有利:-)。您可能希望披露正在使用的PostgreSQL版本。SQL错误:错误:语法错误位于或靠近“p”行1:选择如果p.name为空,则选择“否”否则选择“是”结束如果as@soul,更正-检查我的编辑。抱歉,我主要在SQL Server上工作-语法有点不同。Powaga its postgre Server>我现在遇到的错误是SQL错误:错误:语法错误在或接近“)”p.barcode=t.barcode请尝试我的上一次编辑,希望PostgreSQL中的case
与SQL Server中的类似:-)。SQL错误:错误:语法错误在或接近“)第1065行:选择9556006277096 union)作为p.barcode=t.barcodeSQL错误:错误:函数unnest(text[])不存在第4行:FROM(选择unnest(^提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。@soul:“< /代码>?@灵魂:参见旧版本的其他解决方案。如果可能,请考虑升级”@ ErWiBrand Stutter……非常感谢。试试UR解决方案SQL错误:错误:在“I”行7或附近的语法错误:……选择A.,A系列(1,Alayay-Load(A.A,1))对于此查询,选择x.barcode,p.product_id,如果p.name为空,则选择“否”或“是”结束,因为product_name_存在于(选择a.a,生成_系列(1,数组_upper(a.a,1))i FROM(选择“{679828679830}”::text[]作为a)a)i)使用(条形码)的x个左连接产品;
SELECT x.barcode
, p.product_id
, CASE WHEN p.name IS NULL THEN 'NO' ELSE 'YES' END AS product_name_exists
FROM (SELECT regexp_split_to_table (
'679046,679047,679082,679228,679230,679235,679236,'
'679238,679328,679330,679528,679608,679609,679647,'
'679727,679728,679730,679808,679809,679828,679830', ',') AS barcode
) x
LEFT JOIN product USING (barcode);
SELECT x.barcode
, p.product_id
, CASE WHEN p.name IS NULL THEN 'NO' ELSE 'YES' END AS product_name_exists
FROM (
SELECT a[i] AS barcode
FROM (
SELECT a.a, generate_series(1, array_upper(a.a, 1)) AS i
FROM (
SELECT '{679046,679047,679082,679228,679230,679235,679236,'
'679238,679328,679330,679528,679608,679609,679647,'
'679727,679728,679730,679808,679809,679828,679830}'::text[] AS a
) a
) i
) x
LEFT JOIN product USING (barcode);
SELECT x.barcode
,p.product_id
,CASE WHEN p.name IS NULL THEN 'NO' ELSE 'YES' END AS product_name_exists
FROM (
SELECT '679046' AS barcode
UNION ALL SELECT '679047'
UNION ALL SELECT '679082'
UNION ALL SELECT '679228'
UNION ALL SELECT '679230'
UNION ALL SELECT '679235'
UNION ALL SELECT '679236'
-- ...
) x
LEFT JOIN product USING (barcode);