您可能知道,在许多情况下,需要标记矩阵的某些元素.例如,当我们有加权邻接矩阵,并且我们的图形没有完全连接时,我们必须标记一些元素以表明这些节点之间没有边缘.问题是如何做到这一点?将NaN或Inf放在矩阵中的元素上会更好吗?或其他东西(如-1)?
+--------+---------+-----------+
| id | title | parent_id |
+--------+---------+-----------+
| 1 | Lvl-1 | null |
+--------+---------+-----------+
| 2 | Lvl-2 | null |
+--------+---------+-----------+
| 3 | Lvl-11 | 1 |
+--------+---------+-----------+
| 4 | Lvl-12 | 1 |
+--------+---------+-----------+
| 5 | Lvl-121 | 4 |
+--------+---------+-----------+
Run Code Online (Sandbox Code Playgroud)
我如何actualy获得root父的每一行
例如,行与id 5有父母一方id 4和id 4有父母id 1,所以根身份证id 5是id 1
我没有对如何做到这一点的任何想法,并在那里只用1来解决此问题的方法询问
因为NULL它只是一个未知或缺失的值,所以也许它是TRUE但我们不知道。何为FALSE推定?除了“这是显而易见的”(因为事实并非如此)之外,它还有其他理由吗?或者应该被视为一种 SQL 不良设计工件?
例如:
SELECT * FROM `rainbow_table` WHERE `show_me`
Run Code Online (Sandbox Code Playgroud)
有些行有 null show_me。我们真的不知道是否应该输出这样的行,也许最好显示它(作为防止数据丢失的最后机会)?看起来 SQL 是由悲观主义者开发的。
当在包含空值的列上将可选 sql 参数留空时,我很难返回我期望的所有结果。
假设您有一个包含以下内容的表(referredby 是可选的,因此可以为 NULL):
Customertable
ID CustomerName ReferredBy
1 Aaron Joe
2 Peter NULL
3 Steven Joe
Run Code Online (Sandbox Code Playgroud)
假设我想使用可选的 SQL 参数来查询引用字段,如下所示:
declare @referredby as varchar(15)
select id, customername
from customertable<br>
where referredby = isnull(@referredby, referredby)
Run Code Online (Sandbox Code Playgroud)
如果我将参数保留为空,则只会返回:
1 Aaron
3 Steven
如何使用可选参数返回所有 3 个结果?
我对= nullSQL中的原因有一个粗略的理解,并且is null与此类问题不一样.
但是,为什么呢
update table
set column = null
Run Code Online (Sandbox Code Playgroud)
一个有效的SQL语句(至少在Oracle中)?
从那个答案,我知道null可以看作有点"UNKNOWN",因此带有where column = null"should"的sql语句返回所有行,因为值column不再是未知值.我null明确地将它设置;)
我错在哪里/不明白?
那么,如果我的问题可能不清楚:为什么= null在set子句中有效,而在whereSQL语句的子句中没有?
想象一下一个表(名为Example),它有一个主键字段(KeyID)和一个外键字段(ForeignID).此外键用于将表中的行链接到单独表中的外部行/项,从而建立多对一关系.但是,对于我们的许多行,不存在这样的关系,因此我们的外键字段NULL位于这些行中.
现在,如果给出一个KeyID(例如123),获取包含具有匹配的ForeignID值的所有行的结果集的首选SQL是什么?
我天真地开始使用以下SQL:
SELECT E1.*
FROM Example E1
JOIN Example E2
ON E2.KeyID = 123
AND E2.ForeignID = E1.ForeignID
Run Code Online (Sandbox Code Playgroud)
当我们的匹配键行在ForeignID中具有正常值时,这非常有用.但是,如果出现了ForeignID,它将失败(不返回任何内容)NULL.做一些初步搜索后,我现在明白为什么(后读这样的问题这一个),但我还没有找到如何解决此限制的任何好的解决方案.
授予SQL Server的ANSI_NULLS设置我可以更改,但这似乎是一个肮脏的,可能有问题的黑客.
或者,我总是可以组成我自己的伪空值(如0)并将其粘贴在ForeignID列中而不是NULL,但这会破坏我为此列建立的外键约束.
那么如何最好地实现我想要的呢?
在有人评论之前已经在其他问题上回答过这个问题之前,我知道这一点......但是尽管我已经回顾了这些答案
甚至我自己的问题
我无法让我的查询返回带有null参数的值
我已经尝试简化我的代码,因此可以在这里看到.
我也试过这个
int? i = null;
SqlConnection connection = new SqlConnection(Properties.Settings.Default.connstring.ToString());
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull);
cmd.Connection.Open();
var dataReader = cmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
cmd.Connection.Close();
Run Code Online (Sandbox Code Playgroud)
我尝试过这方面的变化
cmd.Parameters.AddWithValue("@parent_pk", DBNull.Value);
Run Code Online (Sandbox Code Playgroud)
我尝试过使用该查询
cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
Run Code Online (Sandbox Code Playgroud)
我尝试将参数明确声明为可为空
cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull).IsNullable = true; …Run Code Online (Sandbox Code Playgroud) (NULL = NULL) 是假的.精细.记住"NULL被定义为不等于任何东西".
(NULL = NULL) 是假的.呃......好的,公平的.记住"NULL代表一个未定义的值,所以你永远不知道它是否与其他东西相等".
NOT(NULL = NULL) 是假的.等等,什么!
说真的,这怎么可能有效?"NOT()"运算符的行为如何依赖于正在计算的表达式的细节!?所有SQL系统都这样做吗?
SELECT '"1 & 1"',
'"1 = 1" is ' + (CASE WHEN (1=1) THEN 'true' ELSE 'false' END) AS 'a=b',
'"1 <> 1" is ' + (CASE WHEN (1<>1) THEN 'true' ELSE 'false' END) AS 'a<>b',
'"NOT(1=1)" is ' + (CASE WHEN NOT(1=1) THEN 'true' ELSE 'false' END) AS 'NOT(a=b)',
'"NOT(1<>1)" is ' + (CASE WHEN NOT(1<>1) THEN …Run Code Online (Sandbox Code Playgroud) 我有两个表:
1.tableA是一个包含许多列的记录列表.有一个名为"created"的时间戳列
2. tableB用于跟踪我的应用程序中已锁定tableA中的记录以供审阅的用户.它由四列组成:id,user_id,record_id和另一个时间戳列.
我正在尝试从tableA中选择最多10条记录,这些记录尚未被tableB中的任何人锁定以供查看(我还在tableA中的一些其他列中过滤WHERE子句,如记录状态).这是我到目前为止所提出的:
SELECT tableA.* FROM tableA
LEFT OUTER JOIN tableB ON tableA.id = tableB.record_id WHERE
tableB.id = NULL AND
tableA.status = 'new' AND
tableA.project != 'someproject' AND
tableA.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59'
ORDER BY tableA.created ASC LIMIT 0, 10;
Run Code Online (Sandbox Code Playgroud)
tableA中目前有几千条记录,tableB中有零条记录.肯定有这些时间戳之间的记录,我用简单的方法验证了这一点
SELECT * FROM tableA WHERE
created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59'
Run Code Online (Sandbox Code Playgroud)
上面的第一个语句返回零行,第二个语句返回超过2,000行.
考虑以下代码 - 有人可以向我解释为什么一个查询不会抛出错误?我可以理解为什么它没有返回记录,但是它想要做什么?请记住,colA是一个int.它在2000,2005和2008 r2上的工作原理相同
create table #foo
( colA int )
insert into #foo
(colA)
values
(null)
select * from #foo --returns the one record we just created
select * from #foo where colA = null --does not throw an error and does not return a record! why??
select * from #foo where colA is null --returns the record
drop table #foo
Run Code Online (Sandbox Code Playgroud)
这个表中是否存在可以返回colA = null的记录?
我目前没有任何其他数据库供我试用 - 这是标准还是特定于MSSQL的行为?
这可能是其他数据库中的情况,但是当您进行以下查询时
SELECT * FROM MyTbl WHERE MyColumn != 'Foo'
Run Code Online (Sandbox Code Playgroud)
那么MyColumn的任何记录,比方说,'Bar'被取出但不是MyColumn为NULL的地方.我认为这是预期的行为,背后有一个原因,我想知道为什么.
NULL被认为等于'Foo',或者它只是不期望成为条件的一部分,因为条件(NULL!='Foo')似乎是真的.
假设我有两个名为aTable1,aTable2的表
aTable1将userID设置为identity并包含以下数据:
userID email FirstName LastName
1 NULL C CC
2 NULL D DD
3 a@yahoo.com A AA
4 b@yahoo.com B BB
5 e@yahoo.com E EE
6 f@yahoo.com NULL NULL
7 g@yahoo.com NULL NULL
Run Code Online (Sandbox Code Playgroud)
aTable2包含以下数据:
userID email FirstName LastName Title
3 a@yahoo.com A AA student
4 b@yahoo.com B BB student
5 e@yahoo.com E EE student
NULL NULL C CC dean
NULL NULL D DD advisor
NULL f@yahoo.com NULL NULL student2
NULL g@yahoo.com NULL NULL student3
Run Code Online (Sandbox Code Playgroud)
我想基于aTable1更新aTable2.userID,但知道2个表中有空值,所以我喜欢这样:
set ANSI_NULLS off
update …Run Code Online (Sandbox Code Playgroud) 我解雇了一个查询
SELECT * FROM tblEmp WHERE emp_id = 9737 AND mgr_id = NULL
Run Code Online (Sandbox Code Playgroud)
它没有回报任何价值.直到昨天它才这样做.什么可能改变?我们很多人在同一台服务器上工作,所以有可能有人改变了一些东西.
为了获得结果,我必须解雇
SELECT * FROM tblEmp WHERE emp_id = 9737 AND mgr_id IS NULL
Run Code Online (Sandbox Code Playgroud)
这是给出适当的输出.
由于我正在使用此查询,.Net我担心如果设置重置为上一个时它会中断.会吗?
sql ×10
sql-server ×7
null ×4
mysql ×3
c# ×1
dbnull ×1
hierarchical ×1
left-join ×1
matlab ×1
oracle ×1
select ×1
sql-update ×1
sqlparameter ×1
t-sql ×1
timestamp ×1