簡體   English   中英

SQL可以對數字的重要部分進行排序嗎?

[英]Can SQL sort on the significant part of a number?

我有一列國家撥號代碼我希望將前綴過濾到最左邊的撥號代碼中

這是源列:

prefix
------
542
54299
374
37477
37493
37494
37498
37447
37455
3749
37410
297
29756
29759
29766
29769
29796
29799
29773
29774
297600
297622
247
61
61861
61862
61863

這是我想要的結果的一個例子。 sql可以輕松地做到這一點,以及如何或有更好的方法。 請記住,將有大約30k行

significant     prefix
----------------------
542             542
542             54299
374             374
374             37477
374             37493
374             37494
374             37498
374             37447
374             37455
374             3749
374             37410
297             297
297             29756
297             29759
297             29766
297             29769
297             29796
297             29799
297             29773
297             29774
297             297600
297             297622
247             247
61              61
61              61861
61              61862
61              61863

您可能想嘗試以下(使用MySQL的INSTR()LENGTH()函數):

SELECT ( SELECT   prefix 
         FROM     numbers n2 
         WHERE    INSTR(n1.prefix, n2.prefix) = 1 
         ORDER BY LENGTH(n2.prefix) 
         LIMIT    1
       ) AS significant,
       n1.prefix
FROM   numbers n1;

查看@ onedaywhen的上述查詢的ANSI SQL版本的答案

測試用例:

CREATE TABLE numbers (prefix int);

INSERT INTO numbers VALUES (542);
INSERT INTO numbers VALUES (54299);
INSERT INTO numbers VALUES (374);
INSERT INTO numbers VALUES (37477);
INSERT INTO numbers VALUES (37493);
INSERT INTO numbers VALUES (37494);
INSERT INTO numbers VALUES (37498);
INSERT INTO numbers VALUES (37447);
INSERT INTO numbers VALUES (37455);
INSERT INTO numbers VALUES (3749);
INSERT INTO numbers VALUES (37410);
INSERT INTO numbers VALUES (297);
INSERT INTO numbers VALUES (29756);
INSERT INTO numbers VALUES (29759);
INSERT INTO numbers VALUES (29766);
INSERT INTO numbers VALUES (29769);
INSERT INTO numbers VALUES (29796);
INSERT INTO numbers VALUES (29799);
INSERT INTO numbers VALUES (29773);
INSERT INTO numbers VALUES (29774);
INSERT INTO numbers VALUES (297600);
INSERT INTO numbers VALUES (297622);
INSERT INTO numbers VALUES (247);
INSERT INTO numbers VALUES (61);
INSERT INTO numbers VALUES (61861);
INSERT INTO numbers VALUES (61862);
INSERT INTO numbers VALUES (61863);

結果:

+-------------+--------+
| significant | prefix |
+-------------+--------+
|         542 |    542 |
|         542 |  54299 |
|         374 |    374 |
|         374 |  37477 |
|         374 |  37493 |
|         374 |  37494 |
|         374 |  37498 |
|         374 |  37447 |
|         374 |  37455 |
|         374 |   3749 |
|         374 |  37410 |
|         297 |    297 |
|         297 |  29756 |
|         297 |  29759 |
|         297 |  29766 |
|         297 |  29769 |
|         297 |  29796 |
|         297 |  29799 |
|         297 |  29773 |
|         297 |  29774 |
|         297 | 297600 |
|         297 | 297622 |
|         247 |    247 |
|          61 |     61 |
|          61 |  61861 |
|          61 |  61862 |
|          61 |  61863 |
+-------------+--------+
27 rows in set (0.00 sec)

即使您使用varchar存儲數字,它也應該工作。


更新:

至於性能,您可能需要考慮緩存表中的significant部分:

CREATE TABLE numbers (prefix int, significant int);

-- Fill in the prefixes, leaving the significant field as NULL.

然后你可以生成如下significant字段(使用MySQL):

UPDATE numbers n
JOIN   ( SELECT ( SELECT   prefix 
                  FROM     numbers n2 
                  WHERE    INSTR(n1.prefix, n2.prefix) = 1 
                  ORDER BY LENGTH(n2.prefix) 
                  LIMIT    1
                ) AS significant,
                n1.prefix
         FROM   numbers n1
       ) s ON (s.prefix = n.prefix)
SET    n.significant = s.significant;

SELECT * FROM numbers;
+--------+-------------+
| prefix | significant |
+--------+-------------+
|    542 |         542 |
|  54299 |         542 |
|    374 |         374 |
|  37477 |         374 |
|  37493 |         374 |
|  37494 |         374 |

...

每當在numbers表中添加新行時,您可能希望運行UPDATE查詢。

這個問題只有一個'sql'標簽(沒有'MySQL'標簽)所以這里是一個使用標准SQL的建議解決方案,假設prefix是名為Numbers的表中的INTEGER列:

SELECT (
        SELECT MIN(N2.prefix)
          FROM Numbers AS N2
         WHERE CAST(N1.prefix AS VARCHAR) LIKE CAST(N2.prefix AS VARCHAR) + '%'
       ) AS significant, 
       N1.prefix
  FROM Numbers AS N1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM