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。你应该问另一个问题。卢卡斯似乎已经回答了你的问题。