如何计算我在SELECT查询中替换的值?

时间:2014-09-12 10:33:40

标签: php sql

我试图设计一个允许我为客户订单计算匹配邮政编码的查询,但我不知道如何嵌套函数调用来实现这一点。这就是我所拥有的;

SELECT * FROM `xcart_orders` WHERE COUNT(REPLACE(s_zipcode, ' ', '')) > 2

我知道这是错误的,因为你无法嵌套聚合。那我怎么做到这一点?我不确定如何用问题来表达相关的答案。理想情况下,我还想使用UPPER或UCASE替换字符大小写来计算匹配值,无论大小写和空格都是如此,但我不想让我的破解查询更复杂。

一旦我理解了嵌套函数调用的原理,希望这也会告诉我如何链接它们,但如果需要不同的语法,我希望答案显示如何嵌套函数COUNT> UPPER> REPLACE。

这是一个例子;

IM2 6RB
im2 6rb
IM26RB
JE4 8PJ
sa626uf
64295
IM2 6RB
SA62 6UF
64295

这些是我的数据库表中的邮政编码。我想计算邮政编码发生的次数,并从表中返回任何邮政编码不止一次的结果。但要获得准确的匹配,我需要忽略空格和大小写。

我想返回行中的所有行或特定字段,其中多次使用相同的邮政编码。因此,基本上能够显示数据库中的哪些行使用与至少另一行相同的邮政编码。

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT *
FROM `xcart_orders`
INNER JOIN ( 
    SELECT REPLACE(UPPER(s_zipcode), ' ', '') as Zip 
    FROM `xcart_orders`
    GROUP BY REPLACE(UPPER(s_zipcode), ' ', '')
    HAVING COUNT(REPLACE(UPPER(s_zipcode), ' ', '')) > 1
) XXX ON (REPLACE(UPPER(s_zipcode), ' ', '') = XXX.Zip)

请参阅演示here

答案 1 :(得分:1)

我还不清楚,你想做什么,但这是第一次尝试回答。

查询中的操作顺序大致是

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. ORDER BY
  6. 选择
  7. 因此COUNT()子句中不能使用WHERE等聚合函数 如果您没有指定GROUP BY子句,则聚合函数将应用于整个数据集,并且您的结果集中只有一行。

    您似乎只想选择那些必须三次替换空格的行。您不能使用COUNT(),因为它用于计算行数,而不是其他任何内容。

    但是,您可以检查更换后的长度是否减少了3个字符。

    SELECT * FROM `xcart_orders` 
    WHERE CHAR_LENGTH(s_zipcode) - CHAR_LENGTH(REPLACE(s_zipcode, ' ', '')) > 2;
    

    更新(问题编辑后):

    这将为您提供重复项。

    SELECT * 
    FROM xcart_orders xo
    INNER JOIN (
        SELECT REPLACE(UPPER(s_zipcode), ' ', '') as zip
        FROM xcart_orders
        GROUP BY REPLACE(UPPER(s_zipcode), ' ', '')
        HAVING COUNT(*) > 1
    ) sq ON UPPER(REPLACE(xo.s_zipcode), ' ', '')) = sq.zip;
    

答案 2 :(得分:1)

你可以这样做:

SELECT count(*) 
FROM `xcart_orders` 
WHERE 
(length(s_zipcode)-length(REPLACE(s_zipcode,' ', '')))/length(' ') > 0

以下是一个示例:http://sqlfiddle.com/#!2/e7d2c/1/0