【问题标题】:Query to get 3 variations of City Name查询以获取城市名称的 3 个变体
【发布时间】:2015-04-28 16:01:59
【问题描述】:
SELECT * 
FROM orders
WHERE date_ord >=  '2015-02-16'
AND date_ord <=  '2015-02-26'
AND active =1
AND (
(
ship_city =  'NYC'
OR ship_city =  'New York'
OR ship_city =  'New York City'
)
AND ship_state =  'NY'
)
OR (
(
bill_city =  'NYC'
OR bill_city =  'New York'
OR bill_city =  'New York City'
)
AND ship_state =  ''
)
ORDER BY ordId

客户在“NYC”、“New York”和“New York City”等 3 种变体中添加了“New York”城市名称。我需要查询账单城市为所有 3 个变体且运输状态为空或 NULL 的所有记录,以及使用城市名称的所有 3 个变体且运输状态设置为“NY”的运输城市为纽约的记录。简而言之,所有运往纽约市的订单。 (计费状态可以是 CA 或 FL)

这个查询并不完美。我收到的记录早于日期范围。请建议解决此问题。

正如@Ash 和@DovesandChicks 所建议的那样,我尝试使用 IN 函数来做到这一点

SELECT * 
FROM orders
WHERE date_ord >=  '2015-02-16'
AND date_ord <=  '2015-02-26'
AND active =1
AND ship_city
IN ('NYC',  'New York',  'New York City')
OR (bill_city IN ('NYC',  'New York',  'New York City') AND ship_state =  'Unlisted')
ORDER BY ordId

查询还是有问题。请帮忙

【问题讨论】:

  • 这就是为什么您应该在您的订单表中使用 cityid 而不是城市名称的原因。 (以及表格中的约束,以避免这种混乱......)
  • 你有多余的括号。另外,我建议您将 ship_city 中的多个 'OR' 替换为 'IN' 子句。您也只是查询具有“date_ord = '2015-02-16'”的记录,因此不需要 >= 和
  • 见下面我的 cmets,问题是你有一个没有括号的 OR 子句

标签: mysql sql


【解决方案1】:

1) 你可以使用
AND ship_city IN ('NYC', 'New York', 'New York City') 2)您的 OR 子句周围没有足够的括号。您需要将所有 OR 放在一个括号中

所以

WHERE(日期位) AND(带有 OR 的城市位)

如果你需要,我可以全部写出来:

    SELECT * FROM tblorders 
WHERE dateord >= '2015-02-16' 
AND dateord <= '2015-02-26' 
AND activeFlag =1 
AND (s_city IN ( 'NYC', 'New York', 'New York City' ) OR ( b_city IN ( 'NYC', 'New York', 'New York City' ) AND s_state = 'Unlisted' )) 
ORDER BY ordId 

【讨论】:

  • 好的,我尝试根据您和@Ash 的建议使用 IN 进行简化,现在查询是这样的 SELECT * FROM tblorders WHERE dateord >= '2015-02-16' AND dateord
  • 您仍然有一个 OR 破坏了您的查询。确保所有 OR 选项都有括号,否则你最终会选择正确的日期或正确的城市
【解决方案2】:

看起来你在 OR 附近有不必要的括号

SELECT * 
FROM orders
WHERE date_ord >=  '2015-02-16'
AND date_ord <=  '2015-02-26'
AND active =1
AND (
        (
            ship_city =  'NYC'
            OR ship_city =  'New York'
            OR ship_city =  'New York City'
        )
        AND ship_state =  'NY'

    --)
        OR 
    --(

        (
            bill_city =  'NYC'
            OR bill_city =  'New York'
            OR bill_city =  'New York City'
        )
        AND ship_state =  ''
    )
ORDER BY ordId

使用适当的格式,查询更具可读性

条件可以这样简化:

SELECT * 
FROM orders
WHERE date_ord >=  '2015-02-16'
AND date_ord <=  '2015-02-26'
AND active =1
AND ship_city in  ('NYC','New York','New York City')
AND ship_state in ('NY','')
ORDER BY ordId

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多