我的数据库模式中有三个表:my_TABLE、CREATIVE_SIZE、REVERSE_CREATE _VIZE
MY_TABLE
由三列组成
| NAME | BANNER_W | BANNER_H |
| 320x480_Toyota | 320 | 480 |
| Tim_Horton_IO00122_1024x320 | 1024 | 320 |
| Walmart_IO00134 | 80 | 80 |
| Mcdonalds_320x1024 | 320 | 1024 |
....
CREATIVE_SIZE_TABLE
由一列组成
| CREATIVE_SIZE |
| 320x480 |
| 1024x320 |
....
REVERSE_CREATIVE_SIZE_TABLE
由两列组成
| CREATIVE_SIZE | REVERSED_SIZE |
| 320x480 | 480x320 |
| 1024x320 | 320x1024 |
....
我有几个条件想要实现:
NAME
上的完整外部JOIN MY_TABLE和CREATIVE_SIZE_TABLE包含CREATIVE_SIZE
由于它是一个完整的外部联接,一些CREATIE_SIZE是NULL,对于这些NULL值,我想做两件事:
a。检查他们的NAME是否包含REVERSED_SIZE,如果包含,则用CREATIVE_SIZE 填充NULL
b。用BANNER_W和BANNER_H(aaaxbbb格式)填充NULL的其余部分
到目前为止,我只有这个,我不知道如何在我的sql语句中添加a.
和b.
:
SELECT CREATIVE_NAME, AD_BANNER_W, AD_BANNER_H, CREATIVE_SIZE
FROM CREATIVE_SIZE_TABLE cst
LEFT JOIN CREATIVE_SIZE cs
ON cst.CREATIVE_NAME ILIKE '%' || cs.CREATIVE_SIZE || '%'
感谢您的帮助。谢谢
只需使用左联接,然后合并即可找到非空联接。
SELECT COALESCE(cs.CREATIVE_SIZE, revs.REVERSED_SIZE, AD_BANNER_W||'x'||AD_BANNER_H) as MYSIZE,
CREATIVE_NAME, AD_BANNER_W, AD_BANNER_H, CREATIVE_SIZE
FROM CREATIVE_SIZE_TABLE cst
LEFT JOIN CREATIVE_SIZE cs
ON cst.CREATIVE_NAME ILIKE '%' || cs.CREATIVE_SIZE || '%'
LEFT JOIN REVERSE_CREATIVE_SIZE_TABLE revs
ON cst.CREATIVE_NAME ILIKE '%' || revs.REVERSED_SIZE || '%'
注意:虽然这会起作用,但LIKE总是很慢——如果你经常这样做,你可能想对数据进行一些预处理,以加快查询速度——如果这是一次性的,那也没关系。
与Hogan发布的代码相同,但使用CONTAINS来避免在WHERE子句中进行字符串操作
WITH my_table AS (
SELECT * FROM VALUES
('320x480_Toyota', 320, 480)
,('Tim_Horton_IO00122_1024x320', 1024, 320)
,('Walmart_IO00134', 80, 80)
,('Mcdonalds_320x1024', 320, 1024)
v(name, banner_w, banner_h)
), creative_size_table AS (
SELECT * FROM VALUES
('320x480' ),
('1024x320')
v(creative_size )
), reverse_creative_size_table AS (
SELECT * FROM VALUES
('320x480', '480x320' ),
('1024x320', '320x1024' )
v(creative_size, reversed_size)
)
SELECT mt.name
,COALESCE(cst.creative_size, rcst.creative_size, mt.banner_w || 'x' || mt.banner_h) as NEW_CREATIVE_SIZE
,cst.creative_size AS cst_creative_size
,rcst.creative_size AS rcst_creative_size
,rcst.reversed_size AS rcst_reversed_size
FROM my_table mt
LEFT JOIN creative_size_table cst ON CONTAINS(mt.name, cst.creative_size)
LEFT JOIN reverse_creative_size_table rcst ON CONTAINS(mt.name, rcst.reversed_size)
ORDER BY 1;
给出:
NAME NEW_CREATIVE_SIZE CST_CREATIVE_SIZE RCST_CREATIVE_SIZE RCST_REVERSED_SIZE
320x480_Toyota 320x480 320x480 NULL NULL
Mcdonalds_320x1024 1024x320 NULL 1024x320 320x1024
Tim_Horton_IO00122_1024x320 1024x320 1024x320 NULL NULL
Walmart_IO00134 80x80 NULL NULL NULL