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);