【问题标题】:How to write sql query to select other if not found如果找不到,如何编写sql查询以选择其他
【发布时间】:2017-09-22 06:06:54
【问题描述】:

我在表中有记录,这些记录在destinationcountryid 字段中具有值,例如 638,101 和 -1。 -1 是默认值,如果没有匹配选择查询应该返回这条记录。

我在下面写了sql查询。

SELECT
  externalid
FROM
  mLookup.Addon_Spec_Tbl
WHERE
  productid = 30046 AND keyid = 2 AND countryid = 638 AND clientid = 10018 AND subkeyid = 4 AND destinationcountryid IN(302,
  -1)
ORDER BY
  id DESC
LIMIT 1

在这里我没有得到正确的结果。 我的表架构如下

CREATE TABLE spec_tbl(
  id SERIAL NOT NULL,
  productid INTEGER NOT NULL,
  keyid INTEGER,
  subkeyid INTEGER,
  externalid CHARACTER VARYING(100),
  countryid INTEGER,
  destinationcountryid INTEGER,
  originid INTEGER,
  destinationid INTEGER,
  clientid INTEGER,
  categoryid INTEGER,
  created TIMESTAMP WITHOUT TIME zone DEFAULT NOW(), 
  modified TIMESTAMP WITHOUT TIME zone DEFAULT NOW(), 
  enabled BOOLEAN DEFAULT TRUE, 
  CONSTRAINT spec_tbl_pkey PRIMARY KEY(id))

示例插入

INSERT INTO spec_tbl(
productid, keyid, subkeyid, externalid, countryid, destinationcountryid, originid, destinationid, clientid, categoryid, remarks)
VALUES
(30046, 2, 4   , 'ABC', 638, 603, NULL, NULL, 10018, 25,'International Round Trip(include India) One Way Trip'),
(30046, 2, 4   , 'LMP', 638, 302, NULL, NULL, 10018, 25,'International Round Trip(include Bangladesh) One Way Trip'),
(30046, 2, 4   , 'KJP', 638, 208, NULL, NULL, 10018, 25,'International Round Trip(include Cuba) One Way Trip')
(30046, 2, 4   , 'XYZ', 638, -1, NULL, NULL, 10018, 25,'International Round Trip'),
;

我收到了回复,但它返回的 destinationcountryid 记录 = -1。 但是存在匹配的destinationcountryid = 302。我希望这会成为结果。

【问题讨论】:

  • 我不知道你在这里问什么。如果该查询没有返回任何记录,并且您 100% 确定逻辑是正确的,那么您的数据就是问题所在。无论如何,如果您可以通过向我们展示示例数据以及预期输出来重新表述您的问题,这可能有助于澄清事情。
  • 添加样本记录
  • 通过限制条款我猜它是MySQL。请具体说明标签。
  • @PacoDePaco Postgres 也有一个LIMIT
  • 它在 postgres 中,但这没关系。

标签: mysql database postgresql


【解决方案1】:

我认为你想要的逻辑是,如果你当前的查询成功匹配了一条记录,则返回该记录的外部 id 值,否则返回 -1。我们可以通过将您的查询放入 CTE 来模拟这种行为。然后,将该查询与返回 -1 的查询合并,该查询仅在 CTE 未返回任何记录时触发。

WITH cte AS (
    SELECT externalid
    FROM Spec_Tbl
    WHERE
        productid = 30046 AND
        keyid = 2 AND
        countryid = 638 AND
        clientid = 10018 AND
        subkeyid = 4 AND
        destinationcountryid = 302
    ORDER BY id DESC
    LIMIT 1
)

SELECT externalid::int
FROM cte
UNION ALL
SELECT -1
WHERE (SELECT COUNT(*) FROM cte) = 0;

【讨论】:

  • 如何写作为最终查询?
  • 我不明白你的问题。
  • 我复制上面并在sql提示符下执行。它给出了错误。错误:无法匹配 UNION 类型的字符变化和整数。第 18 行:选择 -1
  • externalid 是字符列吗?可能不应该。试试我更新的答案。
  • 选择结果中可以有多个列。
猜你喜欢
  • 2022-08-04
  • 2021-07-01
  • 2017-03-04
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
相关资源
最近更新 更多