Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 转换为整数后在字符串上联接_Mysql_Sql_Join_Sql Convert - Fatal编程技术网

Mysql 转换为整数后在字符串上联接

Mysql 转换为整数后在字符串上联接,mysql,sql,join,sql-convert,Mysql,Sql,Join,Sql Convert,在将字符转换为INT后,我正在尝试对字符进行左连接。像这样: SELECT o.title, d.title FROM original o LEFT JOIN directory d ON CONVERT(o.directory_index, UNSIGNED INT) = d.index 如果索引大于零,这将为我提供正确的响应。但是,如果索引为零或空字符串,我会为每个目录标题获取重复的行: o.title (o.index) d.title (d.ind

在将
字符转换为
INT
后,我正在尝试对
字符进行
左连接。像这样:

SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(o.directory_index, UNSIGNED INT) = d.index
如果索引大于零,这将为我提供正确的响应。但是,如果索引为零或空字符串,我会为每个目录标题获取重复的行:

o.title       (o.index)    d.title          (d.index)

"Big Boss"    "2"          "OUTER HEAVEN"    2
"Snake"       "0"          "FOX"             0
"Snake"       "0"          "FOXHOUND"        1
"Snake"       "0"          "OUTER HEAVEN"    2
"Kerotan"     ""           "FOX"             0
"Kerotan"     ""           "FOXHOUND"        1
"Kerotan"     ""           "OUTER HEAVEN"    2
因此,我添加了一个
COALESCE
语句,将每个空字符串转换为
NULL
值:

SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(
    CASE WHEN COALESCE(o.directory_index, '') = '' THEN NULL ELSE o.directory_index END,
    UNSIGNED INT
) = d.index
COALESCE
语句确实给了我正确的响应(我单独测试了函数的输出),但是现在我得到了每个目录标题的
NULL
,除非索引设置为
0
,在这种情况下,我得到的结果与以前相同:

o.title       (o.index)    d.title          (d.index)

"Big Boss"    "2"          NULL              2
"Snake"       "0"          "FOX"             0
"Snake"       "0"          "FOXHOUND"        1
"Snake"       "0"          "OUTER HEAVEN"    2
"Kerotan"     ""           NULL              0
"Kerotan"     ""           NULL              1
"Kerotan"     ""           NULL              2 
我做错了什么


正如建议的那样,我去掉了
COALESCE
语句,并将其替换为
NULLIF
语句:

SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(
    NULLIF(o.directory_index, ''),
    UNSIGNED INT
) = d.index
但是,我遇到了相同的结果,就好像我得到了
COALESCE
语句一样

我创建了一系列我提供的示例,奇怪的是,它给出了我想要的结果。但这不是我在工作台上得到的结果。服务器运行的是较旧版本的MySQL(我想是5.1?),这可能是问题所在吗



好的。。。所以我很尴尬。我昨天一整天都在用头撞墙。然后我今天早上进来看了看,原来应该是
LEFT-JOIN。。。在d、 索引
已设置为左连接。。。在d、 标题
。我将在这个问题上投票给所有人。但我希望你们都投票否决我和/或将问题标记为结束。

COALESCE
不会将空字符串替换为空值。相反,它返回列表中的第一个非空表达式

要用NULL替换长度为零的字符串,可以使用多种表达式

 NULLIF(expr,'')

 IF(expr='',NULL,expr)

 CASE WHEN expr = '' THEN NULL ELSE expr END
要将字符串(CHAR,VARCHAR)表达式转换为数值,可以使用以下简称:

expr + 0 
但这并不能保证返回无符号INT,甚至是整数值


原始答案如下

这里缺少的是“directory”表中的“directory_index”列和“original”表中的“index”列的定义

这些列的数据类型是什么?它们是可为null的还是唯一的?是否存在外键关系

如果我们不知道你想要实现什么,就不可能回答你的问题“我做错了什么”

乍一看,连接条件看起来比它需要的复杂得多

你能解释一下为什么这不起作用吗

通过在连接条件中添加函数,您试图解决什么问题

您似乎知道数据类型转换(从CHAR到INT,等等),并且您似乎知道MySQL将隐式地进行很多数据类型转换。您可以显式地进行这些数据类型转换,并可以覆盖MySQL在默认情况下的功能

在数字上下文中,MySQL将空字符串的值计算为0,而不是NULL。作为一个简单的演示

SELECT '' + 0 
但是,再说一次,你想要实现的是什么

在这里,少量的样本数据和预期的输出将澄清规范

如何实现该结果实际上取决于表达式中使用的列的实际数据类型,以及您希望返回的内容


我们提出的任何“试试这个”建议都只是猜测,而不是答案。

COALESCE
不会将空字符串替换为空值。相反,它返回列表中的第一个非空表达式

要用NULL替换长度为零的字符串,可以使用多种表达式

 NULLIF(expr,'')

 IF(expr='',NULL,expr)

 CASE WHEN expr = '' THEN NULL ELSE expr END
要将字符串(CHAR,VARCHAR)表达式转换为数值,可以使用以下简称:

expr + 0 
但这并不能保证返回无符号INT,甚至是整数值


原始答案如下

这里缺少的是“directory”表中的“directory_index”列和“original”表中的“index”列的定义

这些列的数据类型是什么?它们是可为null的还是唯一的?是否存在外键关系

如果我们不知道你想要实现什么,就不可能回答你的问题“我做错了什么”

乍一看,连接条件看起来比它需要的复杂得多

你能解释一下为什么这不起作用吗

通过在连接条件中添加函数,您试图解决什么问题

您似乎知道数据类型转换(从CHAR到INT,等等),并且您似乎知道MySQL将隐式地进行很多数据类型转换。您可以显式地进行这些数据类型转换,并可以覆盖MySQL在默认情况下的功能

在数字上下文中,MySQL将空字符串的值计算为0,而不是NULL。作为一个简单的演示

SELECT '' + 0 
但是,再说一次,你想要实现的是什么

在这里,少量的样本数据和预期的输出将澄清规范

如何实现该结果实际上取决于表达式中使用的列的实际数据类型,以及您希望返回的内容


我们提出的任何“试试这个”建议都只是猜测,而不是答案。

这有点让人困惑,因为您的查询看起来像是在查找o.directory\u index…但您显示的数据是o.index(这可能是您的错误吗?) 无论如何,试试这个

SELECT o.title,d.title
FROM original o
LEFT JOIN directory d
ON (CASE WHEN o.directory_index IS NULL OR o.directory_index = '' THEN -1
         ELSE CONVERT(o.directory_index,UNSIGNED INT)
    END) = d.index;
如果CONVERT()是较旧MySQL版本中的错误…可以尝试CAST()

既然CONVERT()到UNSIGNED INT有一个bug…为什么不试试CONVERT()到CHAR。。。像这样(可能不管用,但值得一试)


这有点让人困惑,因为您的查询看起来像是在查找o目录