如果多列集在 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 )

但是:

问题:

是否可以在不使用字符串连接的情况下以某种方式解决这个问题? 这个多列值检查问题有简单的解决方案吗?

我想在 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