Sql 更优雅的批量验证电话号码的方法
我有一个测试数据库,我想用它来验证一个电话号码 但是,目前它一次只能使用一个数字Sql 更优雅的批量验证电话号码的方法,sql,postgresql,Sql,Postgresql,我有一个测试数据库,我想用它来验证一个电话号码 但是,目前它一次只能使用一个数字 SELECT countries.locl_ctry_id, countries.icc, countries.active, networks.locl_ntwrk_id, networks.locl_ctry_id, numberings.locl_ntwrk_id, numberings.ndc FROM countries LEFT JOIN
SELECT
countries.locl_ctry_id,
countries.icc,
countries.active,
networks.locl_ntwrk_id,
networks.locl_ctry_id,
numberings.locl_ntwrk_id,
numberings.ndc
FROM countries
LEFT JOIN networks
ON networks.locl_ctry_id = countries.locl_ctry_id
LEFT JOIN numberings
ON numberings.locl_ntwrk_id = networks.locl_ntwrk_id
WHERE
countries.active = 'true'
AND numberings.locl_ntwrk_id NOTNULL
AND CONCAT(countries.icc, numberings.ndc) LIKE LEFT('381645554330', CHAR_LENGTH(CONCAT(countries.icc, numberings.ndc)))
你们对如何简化这个过程,让它一次处理多个数字而不是一个数字有什么建议吗?你们可以重写查询以使用派生表:
WITH numbers(num) AS
(
VALUES ('381645554330'), ('1223456') -- here goes argument list
), cte AS (
SELECT
countries.locl_ctry_id,
countries.icc,
countries.active,
networks.locl_ntwrk_id,
networks.locl_ctry_id,
numberings.locl_ntwrk_id,
numberings.ndc
FROM countries
LEFT JOIN networks
ON networks.locl_ctry_id = countries.locl_ctry_id
LEFT JOIN numberings
ON numberings.locl_ntwrk_id = networks.locl_ntwrk_id
WHERE countries.active = 'true'
AND numberings.locl_ntwrk_id IS NOT NULL
)
SELECT *
FROM numbers
LEFT JOIN cte
ON CONCAT(icc, ndc) LIKE LEFT(numbers.num, CHAR_LENGTH(CONCAT(icc,ndc)))
WHERE CHAR_LENGTH(numbers.num)=9 -- additional conditions
;
这里有关于电话号码的实际问题吗?@TimBiegeleisen示例位于sqlFiddle。类似于
的表达式是电话号码的“检查”吗?这很有效。在这里,如果我想添加另一个条件,那么这个数字应该满足如下条件:CHAR\u LENGTH(numbers.num)=9
我在哪里添加它?CHAR\u LENGTH(numbers.num)=numberings.size
@Borsn只需使用where
或LEFT。。。在…上而且……
取决于需求。但是9
是从表numberings.size
中获取的数字。如果我在第一个选项中使用numbers.num
,它将看不到它。如果我在第二个中使用numberings.size
,选择它也看不到。@Borsn。你应该问另一个问题。卢卡斯似乎已经回答了你的问题。