SQL 在文本和数字的混合之间选择

Posted

技术标签:

【中文标题】SQL 在文本和数字的混合之间选择【英文标题】:SQL Select between mixture of text and numeric 【发布时间】:2019-08-14 11:21:37 【问题描述】:

不确定是否可以在 SQL 中执行此操作,但是...我很难在某些条件之间选择结果。我有一个混合了文本和数字的列。例如:LOC:05-04-01。我想在两个位置之间选择项目。例如:在 LOC:05-04-01 和 LOC:05-04-20 之间。

我尝试使用标准的 BETWEEN 语句,但它返回一个空结果。

$loc1 = 'LOC:05-04-01';
$loc2 = 'LOC:05-04-20';
$sql = $dbh->prepare("SELECT * FROM table WHERE location BETWEEN ? AND ? ORDER BY location DESC");
$sql->execute([$loc1,$loc2]);
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) 
echo $row['ID'].': '.$row['location'].'<br>';

我的数据库如下:

ID | Location
1 | LOC:05-04-01
2 | LOC:05-04-02
3 | LOC:05-04-05
4 | LOC:06-04-01
5 | LOC:06-04-02
6 | LOC:06-04-10

我希望看到上述查询中的位置列表,例如:

1: LOC:05-04-01
2: LOC:05-04-02
3: LOC:05-04-05

【问题讨论】:

什么是 LOC 05-04-01,以不同的格式存储此信息可能会更好。 您的代码应该可以工作。你有什么问题? @MarkOverton 相信我,如果我做了这个数据库,它就不会像这样存储了!不幸的是,我无法更改它。 您如何定义一个位置“介于”另外两个人之间?对于字符串和数值数据类型,数值具有不同的排序顺序。例如10&gt;2,但'10'&lt;'2'。如果您使用的是固定长度的数值表示,则问题不太可能因为10&gt;2'10'&gt;'02' 都是正确的。 @GordonLinoff 我没有收到任何错误消息或结果 【参考方案1】:

这段代码应该做你想做的:

SELECT *
FROM <table>
WHERE location BETWEEN 'LOC:05-04-01' AND 'LOC:05-04-20'
ORDER BY location DESC;

您正在进行字符串比较,并且值比较为字符串。

您应该使用对数据库的直接查询来测试它。如果这不起作用,那么您可能会在列中包含您不期望的数据 - 假设连字符实际上是一个不同的字符。

如果 php 代码不起作用,则说明该级别出现问题。您的查询可能有错误(例如连接到错误的数据库)。你的常量中可能有错误的字符。

【讨论】:

谢谢你,我已经直接在数据库上运行了查询,我得到了想要的结果,所以你是对的,这与 PHP 代码有关。

以上是关于SQL 在文本和数字的混合之间选择的主要内容,如果未能解决你的问题,请参考以下文章

在Swift或Objective-C中将大型混合数字和文本数字转换为数字

使用 JS 在混合应用程序中禁用文本选择和复制粘贴

在 Microsoft Access SQL 中使用带数字文本值的 between 运算符

文本分类混合CHI和MI的改进文本特征选择方法

选择分类算法对名义数据和数字数据的混合进行分类?

Pl/SQL - 提取文本并在重复时合并