我使用的数据库在我看来并没有以最直观的方式设置。我有两张桌子,我想加入。商店表有关于商店的信息,并且有一个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
我还尝试使用以下
转换为整数或varcharSELECT *
FROM transactions t
LEFT JOIN store_info s ON cast(t.transaction_details->'package_id'
as varchar) = s.store_id
很抱歉这样的菜鸟。谢谢你的帮助。
答案 0 :(得分:0)
您的代码无效,原因有两个。
like
模式只是一个看起来像'%store_id%'
的字符串。列值不在字符串中(请参阅下面的如何执行此操作)。你需要这样的东西:
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过程应该从事务中解析出商店信息。