如果多列集在 table 中(没有字符串连接),如何检查 SQL
How to check in SQL if multi columnar set is in the table (without string concatenation)
假设我在 table 中有 3 列,值如下:
table_1:
A | B | C
-----------------------
'xx' | '' | 'y'
'x' | 'y' | 'x'
'x' | 'x' | 'y'
'x' | 'yy' | ''
'x' | '' | 'yy'
'x' | 'y' | 'y'
我有一个结果集(SQL SELECT 语句的结果),我想在上面 table 中识别它是否存在:
[
('x', 'x', 'y')
('x', 'y', 'y')
]
如果我比较了简单字符串连接的结果,则此结果集将匹配 5(共 6)行,而不是上面 table 中的 2 行,例如我会简单地比较一下这个结果:SELECT concat(A, B, C) FROM table_1
我可以通过比较更复杂的字符串连接函数的结果来解决这个问题,如下所示:SELECT concat('A=', A, '_', 'B=', B, '_', 'C=', C )
但是:
- 我不想在
_
或 =
等字符串连接中使用任何硬编码的特殊分隔符
- 因为任何字符都可能在数据中
- 例如:B 列某处可能有此值:
xx_C=yy
- 这不是一个干净的解决方案
- 我根本不想使用字符串连接,因为这是一个丑陋的解决方案
- 它让属性之间的“距离”消失
- 不够通用
- 也许我有不同数据类型的列,但我不想转换为基于 STRING 的列
问题:
是否可以在不使用字符串连接的情况下以某种方式解决这个问题?
这个多列值检查问题有简单的解决方案吗?
我想在 BiqQuery 中解决这个问题,但我对每个关系的通用解决方案感兴趣 databse/datawarehouse。
谢谢!
CREATE TABLE test.table_1 (
A STRING,
B STRING,
C STRING
) AS
SELECT * FROM (
SELECT 'xx', '', 'y'
UNION ALL
SELECT 'x', 'y', 'x'
UNION ALL
SELECT 'x', 'x', 'y'
UNION ALL
SELECT 'x', 'yy', ''
UNION ALL
SELECT 'x', '', 'yy'
UNION ALL
SELECT 'x', 'y', 'y'
)
SELECT A, B, C
FROM test.table_1
WHERE (A, B, C) IN ( -> I need this functionality
SELECT 'x', 'x', 'y'
UNION ALL
SELECT 'x', 'y', 'y'
);
使用join
:
SELECT t1.*
FROM test.table_1 t1 JOIN
(SELECT 'x' as a, 'x' as b, 'y' as c
UNION ALL
SELECT 'x', 'y', 'y'
) t2
USING (a, b, c);
下面是我能想到的最通用的方式(BigQuery 标准 SQL):
#standardSQL
SELECT *
FROM `project.test.table1` t
WHERE t IN (
SELECT t
FROM `project.test.table2` t
)
您可以使用您问题中的样本数据进行测试,如以下示例所示
#standardSQL
WITH `project.test.table1` AS (
SELECT 'xx' a, '' b, 'y' c UNION ALL
SELECT 'x', 'y', 'x' UNION ALL
SELECT 'x', 'x', 'y' UNION ALL
SELECT 'x', 'yy', '' UNION ALL
SELECT 'x', '', 'yy' UNION ALL
SELECT 'x', 'y', 'y'
), `project.test.table2` AS (
SELECT 'x' a, 'x' b, 'y' c UNION ALL
SELECT 'x', 'y', 'y'
)
SELECT *
FROM `project.test.table1` t
WHERE t IN (
SELECT t
FROM `project.test.table2` t
)
有输出
Row a b c
1 x x y
2 x y y
假设我在 table 中有 3 列,值如下:
table_1:
A | B | C
-----------------------
'xx' | '' | 'y'
'x' | 'y' | 'x'
'x' | 'x' | 'y'
'x' | 'yy' | ''
'x' | '' | 'yy'
'x' | 'y' | 'y'
我有一个结果集(SQL SELECT 语句的结果),我想在上面 table 中识别它是否存在:
[
('x', 'x', 'y')
('x', 'y', 'y')
]
如果我比较了简单字符串连接的结果,则此结果集将匹配 5(共 6)行,而不是上面 table 中的 2 行,例如我会简单地比较一下这个结果:SELECT concat(A, B, C) FROM table_1
我可以通过比较更复杂的字符串连接函数的结果来解决这个问题,如下所示:SELECT concat('A=', A, '_', 'B=', B, '_', 'C=', C )
但是:
- 我不想在
_
或=
等字符串连接中使用任何硬编码的特殊分隔符- 因为任何字符都可能在数据中
- 例如:B 列某处可能有此值:
xx_C=yy
- 例如:B 列某处可能有此值:
- 这不是一个干净的解决方案
- 因为任何字符都可能在数据中
- 我根本不想使用字符串连接,因为这是一个丑陋的解决方案
- 它让属性之间的“距离”消失
- 不够通用
- 也许我有不同数据类型的列,但我不想转换为基于 STRING 的列
问题:
是否可以在不使用字符串连接的情况下以某种方式解决这个问题? 这个多列值检查问题有简单的解决方案吗?
我想在 BiqQuery 中解决这个问题,但我对每个关系的通用解决方案感兴趣 databse/datawarehouse。
谢谢!
CREATE TABLE test.table_1 (
A STRING,
B STRING,
C STRING
) AS
SELECT * FROM (
SELECT 'xx', '', 'y'
UNION ALL
SELECT 'x', 'y', 'x'
UNION ALL
SELECT 'x', 'x', 'y'
UNION ALL
SELECT 'x', 'yy', ''
UNION ALL
SELECT 'x', '', 'yy'
UNION ALL
SELECT 'x', 'y', 'y'
)
SELECT A, B, C
FROM test.table_1
WHERE (A, B, C) IN ( -> I need this functionality
SELECT 'x', 'x', 'y'
UNION ALL
SELECT 'x', 'y', 'y'
);
使用join
:
SELECT t1.*
FROM test.table_1 t1 JOIN
(SELECT 'x' as a, 'x' as b, 'y' as c
UNION ALL
SELECT 'x', 'y', 'y'
) t2
USING (a, b, c);
下面是我能想到的最通用的方式(BigQuery 标准 SQL):
#standardSQL
SELECT *
FROM `project.test.table1` t
WHERE t IN (
SELECT t
FROM `project.test.table2` t
)
您可以使用您问题中的样本数据进行测试,如以下示例所示
#standardSQL
WITH `project.test.table1` AS (
SELECT 'xx' a, '' b, 'y' c UNION ALL
SELECT 'x', 'y', 'x' UNION ALL
SELECT 'x', 'x', 'y' UNION ALL
SELECT 'x', 'yy', '' UNION ALL
SELECT 'x', '', 'yy' UNION ALL
SELECT 'x', 'y', 'y'
), `project.test.table2` AS (
SELECT 'x' a, 'x' b, 'y' c UNION ALL
SELECT 'x', 'y', 'y'
)
SELECT *
FROM `project.test.table1` t
WHERE t IN (
SELECT t
FROM `project.test.table2` t
)
有输出
Row a b c
1 x x y
2 x y y