更改数据类型并在LEFT OUTER JOIN中使用LIKE

时间:2016-09-10 19:35:13

标签: sql postgresql

我使用的数据库在我看来并没有以最直观的方式设置。我有两张桌子,我想加入。商店表有关于商店的信息,并且有一个store_id字段,该字段以varchar格式存储为7位数字。事务表有一个transaction_id字段,该字段设置为hstore并存储为" package_id" =>" 10000417"。我正在尝试加入这两个领域的两个表格。

我试图将transaction_id字段转换为varchar,同时尝试在join语句中使用子查询来添加" package_id" =>"部分到store_id字段。没有结果。所以我尝试在JOIN语句中使用LIKE来添加通配符。还有问题。这是我在使用LIKE时尝试的代码:

SELECT t.amount
    ,t.quantity_sold
    ,t.unit
    ,cast(t.transaction_details as varchar) as join_field
    ,s.product_name
    ,s.product_category
    ,s.metrc_id
FROM transactions t
LEFT JOIN store_info s ON t.transaction_details = s.store_id
WHERE t.transaction_details LIKE '%store_id%'

我尝试过其他一些变体。我希望有人可以提供一个更好的方向,以便尝试链接这两个表格。

提前致谢,

修改

我习惯使用SQL Server而不是Postgresql。我已经对hstore数据类型做了更多的研究,并且稍微了解它。我仍然无法加入这两张桌子。我设法使用以下查询创建了一个只包含ID号的新列。

SELECT *, transaction_details->'package_id' as ID
FROM transactions

我尝试加入,然后调用该列无效,所以我尝试了以下内容:

SELECT *
FROM transactions t
LEFT JOIN store_info s ON t.transaction_details->'package_id' = s.store_id

我还尝试使用以下

转换为整数或varchar
SELECT *
FROM transactions t
LEFT JOIN store_info s ON cast(t.transaction_details->'package_id' 
as varchar) = s.store_id

很抱歉这样的菜鸟。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您的代码无效,原因有两个。

  1. 商店ID和交易详情不符合您对这些列中值的描述。
  2. like模式只是一个看起来像'%store_id%'的字符串。列值不在字符串中(请参阅下面的如何执行此操作)。
  3. 你需要这样的东西:

    SELECT . . .
    FROM transactions t LEFT JOIN
         store_info s
         ON t.transaction_details LIKE '%' || s.store_id || '%';
    

    然而,我怀疑那会不会是你想要的。商店ID应位于交易详情的开头或结尾,建议:

         ON t.transaction_details LIKE '%' || s.store_id
    

    或:

         ON t.transaction_details LIKE s.store_id || '%'
    

    并且,你是对的,这是一个非常糟糕的数据结构。至少,ETL过程应该从事务中解析出商店信息。