SQL 到 select 两行之间
SQL to select between two rows
我有一个 table 这样的:
C A B
-------|----------|-----------|
16 11111 030000
16 11111 050000
16 11111 080000
16 22222 010000
16 22222 020000
16 22222 050000
16 22222 060000
16 22222 070000
我需要 select 11111 050000 和 22222 050000 之间的所有数字,包括。
什么 SQL 是正确的?
最后一个我有但它不起作用:
SELECT *
FROM table
WHERE A <= 22222
AND B < 050000 IN (SELECT id FROM table
WHERE C = 16 AND B >= 050000
AND A BETWEEN 11111 AND 22222
有一些引擎,例如 SQLite,可以让您直接比较行与行:
SELECT * FROM table WHERE (A, B) BETWEEN (11111, '050000') AND (22222, '050000')
当然,这不是标准的,您可能会发现自己需要在需要您编写标准 SQL 代码的引擎中执行此操作。在这种情况下,问题是,值介于这两行之间意味着什么?
在这种情况下,table 按 A 排序,然后按 B 排序。因此,对于行 P 和行 Q 之间的行 X,则(写 R(C) 表示行的 C 列R) P(A) < X(A) < Q(A)(因为在这种情况下,A 的值严格介于它们之间,并且由于 A 是主排序键,因此该行将始终存在)或值A 的值匹配端点之一,然后考虑 B 的值。这分为两种情况:P(A) = X(A) 和 P(B) <= X(B),以及 X(A) = Q(A) 和 X(B) <= Q(B)。
还有一种特殊情况:如果P(A) = Q(A),那么只有B重要,但这需要特殊处理,因为分别使用上面的两个条件会匹配到多余的行。
所以,让我们将所有这些写入参数化查询,使用四个查询参数 :a1
、:b1
、:a2
、:b2
来显示所有情况:
SELECT
*
FROM
table
WHERE
CASE WHEN :a1 = :a2 THEN
B BETWEEN :b1 AND :b2
ELSE
(A > :a1 AND A < :a2) OR
(A = :a1 AND B >= :b1) OR
(A = :a2 AND B <= :b2)
END
这就是一般的解决方案。
SELECT * FROM Temp_Table WHERE CAST(B AS int) BETWEEN 050000 AND 050000
这对你有帮助。
我有一个 table 这样的:
C A B
-------|----------|-----------|
16 11111 030000
16 11111 050000
16 11111 080000
16 22222 010000
16 22222 020000
16 22222 050000
16 22222 060000
16 22222 070000
我需要 select 11111 050000 和 22222 050000 之间的所有数字,包括。
什么 SQL 是正确的?
最后一个我有但它不起作用:
SELECT *
FROM table
WHERE A <= 22222
AND B < 050000 IN (SELECT id FROM table
WHERE C = 16 AND B >= 050000
AND A BETWEEN 11111 AND 22222
有一些引擎,例如 SQLite,可以让您直接比较行与行:
SELECT * FROM table WHERE (A, B) BETWEEN (11111, '050000') AND (22222, '050000')
当然,这不是标准的,您可能会发现自己需要在需要您编写标准 SQL 代码的引擎中执行此操作。在这种情况下,问题是,值介于这两行之间意味着什么?
在这种情况下,table 按 A 排序,然后按 B 排序。因此,对于行 P 和行 Q 之间的行 X,则(写 R(C) 表示行的 C 列R) P(A) < X(A) < Q(A)(因为在这种情况下,A 的值严格介于它们之间,并且由于 A 是主排序键,因此该行将始终存在)或值A 的值匹配端点之一,然后考虑 B 的值。这分为两种情况:P(A) = X(A) 和 P(B) <= X(B),以及 X(A) = Q(A) 和 X(B) <= Q(B)。
还有一种特殊情况:如果P(A) = Q(A),那么只有B重要,但这需要特殊处理,因为分别使用上面的两个条件会匹配到多余的行。
所以,让我们将所有这些写入参数化查询,使用四个查询参数 :a1
、:b1
、:a2
、:b2
来显示所有情况:
SELECT
*
FROM
table
WHERE
CASE WHEN :a1 = :a2 THEN
B BETWEEN :b1 AND :b2
ELSE
(A > :a1 AND A < :a2) OR
(A = :a1 AND B >= :b1) OR
(A = :a2 AND B <= :b2)
END
这就是一般的解决方案。
SELECT * FROM Temp_Table WHERE CAST(B AS int) BETWEEN 050000 AND 050000
这对你有帮助。