我有一张如下表:
TN Tier
90 1
90 N3
30 2
40 3
50 A
"级"列可以包含任何TN的数字和字母数字值。我想在上面的表上运行一个select查询,这样如果对于任何TN,Tier列中都存在(数字和字母数字)值,那么它应该被称为" Mix"否则"数字"或"非数字"。
期望的输出:
TN Result
90 Mix
30 Numeric
40 Numeric
50 Non-Numeric
我能够通过使用多个临时表来实现它,但我想避免使用临时表。任何帮助将不胜感激!!!
答案 0 :(得分:1)
对于MySQL,请将REGEXP
与CASE
表达式一起使用:
SELECT
TN,
CASE WHEN SUM(CASE WHEN Tier REGEXP '[A-Z]' AND Tier REGEXP '[0-9]'
THEN 1 ELSE 0 END) > 0 THEN 'Mix'
WHEN SUM(CASE WHEN Tier REGEXP '[A-Z]'
THEN 1 ELSE 0 END) > 0 THEN 'Non-Numeric'
WHEN SUM(CASE WHEN Tier REGEXP '[0-9]'
THEN 1 ELSE 0 END) > 0 THEN 'Numeric'
ELSE 'Other' END AS Result
FROM yourTable
GROUP BY
TN;
对于SQL Server,您可以使用LIKE
使用适当的模式稍微改变上述查询:
SELECT
TN,
CASE WHEN SUM(CASE WHEN Tier LIKE '%[A-Z]%' AND Tier LIKE '%[0-9]%'
THEN 1 ELSE 0 END) > 0 THEN 'Mix'
WHEN SUM(CASE WHEN Tier LIKE '%[A-Z]%'
THEN 1 ELSE 0 END) > 0 THEN 'Non-Numeric'
WHEN SUM(CASE WHEN Tier LIKE '%[0-9]%'
THEN 1 ELSE 0 END) > 0 THEN 'Numeric'
ELSE 'Other' END AS Result
FROM yourTable
GROUP BY
TN;
@JohnWoo给出的SQL Server答案比这更紧,但是当你用MySQL标记时,我最初回答了这个数据库。
答案 1 :(得分:1)
您可以利用SQL Server
中的ISNUMERIC()功能。
SELECT [TN],
CASE MAX(ISNUMERIC(Tier)) + MIN(ISNUMERIC(Tier))
WHEN 2 THEN 'Numeric'
WHEN 1 THEN 'Mix'
ELSE 'Non-Numeric'
End As Result
FROM TableName
GROUP BY TN
这是Demo。
答案 2 :(得分:0)
你不需要任何大问题,只需简单,
即可试试这个:
Select * from table
然后你可以在while循环中检查你的列的值,每次你可以在你的记录中搜索有数字或没有数字的字符串。
$string = $row['Tier'];
if (preg_match('/[A-Za-z]/', $myString) )
{
echo 'String contains letters';
}
else if(preg_match('/[0-9]/', $myString))
{
echo 'String contains numbers';
}else if($string == '')
{
echo 'String contains no letter and no number';
}
答案 3 :(得分:0)
我希望你使用的是mysql。如果您可以按如下方式编写自定义函数,那就更好了。
delimiter //
CREATE FUNCTION is_numeric(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Example - select is_numeric(id),is_numeric(full_name) FROM tbl_user;