Select 和 Where on multiple (sequential range) of criteria
Select and Where on multiple (sequential range) of criteria
我正在为我的 sheet 寻找一个 SQL 解决方案,它看起来正好是一行 28 列,如果它在该范围内有任何非空值,则检索它。
目前我可以使用这个可怕的公式得到我想要的东西:
QUERY(SomeOtherSheet!A85:BA,"select A,B,C,O,P,Q,R,S,T,U,V,W,X,Y,Z where (O>=0 OR P>=0 OR Q>=0 OR R>=0 OR S>=0 OR T>=0 OR U>=0 OR V>=0 OR W>=0 OR X>=0 OR Y>=0 OR Z>=0) ",1)
足以说明 O-Z 的范围不完全是 28 长,但它足以展示我在此示例中寻找的内容。
问题)有没有更好的方法来实现对连续列范围的这种查询?
特别是在我的例子中,O-AQ
的范围
我想我可以在不同的单元格中动态地将所需的列串在一起。但我宁愿不...
好吧,我已经弄明白了如何使用尽可能少的静态幻数动态连接字符串:
首先,一个单元格包含:
=ARRAY_CONSTRAIN(ArrayFormula((IF((COLUMN(Lifetime!N:)+64)>CODE("Z"),"A"&CHAR(MOD(COLUMN(Lifetime!N:),26)+64),""&CHAR(COLUMN(Lifetime!N:)+64)))),1,28)
这给了我们以下数组:
N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO
此数组可轻松用于查询的 Select 部分。
我允许自己不考虑将成为 B* 的单元格的自由,因为我的个人 sheet 不会到达那里。 Array_constrain()
列参数允许在将来需要时快速更改为不同大小的数组。
其次,一个简单的 textjoin()
+ regexreplace()
用于所需的 where 子句
=REGEXREPLACE(TEXTJOIN(",",FALSE,A119:AB119),",",">=0 OR ")&">=0"
这会生成 where 子句所需的字符串:
N>=0 OR O>=0 OR P>=0 OR Q>=0 OR R>=0 OR S>=0 OR T>=0 OR U>=0 OR V>=0 OR W>=0 OR X>=0 OR Y>=0 OR Z>=0 OR AA>=0 OR AB>=0 OR AC>=0 OR AD>=0 OR AE>=0 OR AF>=0 OR AG>=0 OR AH>=0 OR AI>=0 OR AJ>=0 OR AK>=0 OR AL>=0 OR AM>=0 OR AN>=0 OR AO>=0
最终产品:
=ARRAY_CONSTRAIN(QUERY(Lifetime!A85:BA,"select A,B,C,"&120&" where ("&A121&")",1),105,20)
或单线:
=REGEXREPLACE(TEXTJOIN(",",FALSE,ARRAY_CONSTRAIN(ArrayFormula((IF((COLUMN(Lifetime!N:)+64)>CODE("Z"),"A"&CHAR(MOD(COLUMN(Lifetime!N:),26)+64),""&CHAR(COLUMN(Lifetime!N:)+64)))),1,28)),",",">=0 OR ")&">=0"
我知道 OP 已经回答了。但是提交这个作为替代:
对于Select,
=ARRAYFORMULA(JOIN(",",CHAR(ROW(65:90)),"A"&CHAR(ROW(65:90))))
对于 where OR 部分:
=ARRAYFORMULA(JOIN(">=0 OR ", CHAR(Row(65:90)),"A"&CHAR(ROW(65:90))))&">=0"
要更改开始和结束部分,请更改行号开始和结束部分:
请尝试将范围转换为数组:
QUERY({SomeOtherSheet!A85:BA},"select Col1,Col2,Col3,...")
我总是使用这种方法并通过索引在查询中搜索列,例如查找名为 "Name":
的列
=match("Name", SomeOtherSheet!A85:BA85, 0)
更新。合并查询的 OR
部分:
="where Col"&JOIN(" >= 0 or Col",ARRAYFORMULA(COLUMN(O1:Z1)))&" >= 0"
结果是:
"where Col15 >= 0 or Col16 >= 0 or Col17 >= 0 or Col18 >= 0 or Col19 >= 0 or Col20 >= 0 or Col21 >= 0 or Col22 >= 0 or Col23 >= 0 or Col24 >= 0 or Col25 >= 0 or Col26 >= 0"
如果新列将粘贴到 O1:Z1
范围内,则此公式将进行调整。在实际项目中,按点查找范围很有用:起始单元格、最后一个单元格,然后使用 indirect
:
="where Col"&JOIN(" >= 0 or Col",ARRAYFORMULA(COLUMN(indirect(range))))&" >= 0"
其中 range
是带有字符串 "O1:Z1" 的范围名称,"O1" 和 "Z1" 是通过它们的列名或 ID 找到的。
我正在为我的 sheet 寻找一个 SQL 解决方案,它看起来正好是一行 28 列,如果它在该范围内有任何非空值,则检索它。
目前我可以使用这个可怕的公式得到我想要的东西:
QUERY(SomeOtherSheet!A85:BA,"select A,B,C,O,P,Q,R,S,T,U,V,W,X,Y,Z where (O>=0 OR P>=0 OR Q>=0 OR R>=0 OR S>=0 OR T>=0 OR U>=0 OR V>=0 OR W>=0 OR X>=0 OR Y>=0 OR Z>=0) ",1)
足以说明 O-Z 的范围不完全是 28 长,但它足以展示我在此示例中寻找的内容。
问题)有没有更好的方法来实现对连续列范围的这种查询? 特别是在我的例子中,O-AQ
的范围我想我可以在不同的单元格中动态地将所需的列串在一起。但我宁愿不...
好吧,我已经弄明白了如何使用尽可能少的静态幻数动态连接字符串:
首先,一个单元格包含:
=ARRAY_CONSTRAIN(ArrayFormula((IF((COLUMN(Lifetime!N:)+64)>CODE("Z"),"A"&CHAR(MOD(COLUMN(Lifetime!N:),26)+64),""&CHAR(COLUMN(Lifetime!N:)+64)))),1,28)
这给了我们以下数组:
N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO
此数组可轻松用于查询的 Select 部分。
我允许自己不考虑将成为 B* 的单元格的自由,因为我的个人 sheet 不会到达那里。 Array_constrain()
列参数允许在将来需要时快速更改为不同大小的数组。
其次,一个简单的 textjoin()
+ regexreplace()
用于所需的 where 子句
=REGEXREPLACE(TEXTJOIN(",",FALSE,A119:AB119),",",">=0 OR ")&">=0"
这会生成 where 子句所需的字符串:
N>=0 OR O>=0 OR P>=0 OR Q>=0 OR R>=0 OR S>=0 OR T>=0 OR U>=0 OR V>=0 OR W>=0 OR X>=0 OR Y>=0 OR Z>=0 OR AA>=0 OR AB>=0 OR AC>=0 OR AD>=0 OR AE>=0 OR AF>=0 OR AG>=0 OR AH>=0 OR AI>=0 OR AJ>=0 OR AK>=0 OR AL>=0 OR AM>=0 OR AN>=0 OR AO>=0
最终产品:
=ARRAY_CONSTRAIN(QUERY(Lifetime!A85:BA,"select A,B,C,"&120&" where ("&A121&")",1),105,20)
或单线:
=REGEXREPLACE(TEXTJOIN(",",FALSE,ARRAY_CONSTRAIN(ArrayFormula((IF((COLUMN(Lifetime!N:)+64)>CODE("Z"),"A"&CHAR(MOD(COLUMN(Lifetime!N:),26)+64),""&CHAR(COLUMN(Lifetime!N:)+64)))),1,28)),",",">=0 OR ")&">=0"
我知道 OP 已经回答了。但是提交这个作为替代:
对于Select,
=ARRAYFORMULA(JOIN(",",CHAR(ROW(65:90)),"A"&CHAR(ROW(65:90))))
对于 where OR 部分:
=ARRAYFORMULA(JOIN(">=0 OR ", CHAR(Row(65:90)),"A"&CHAR(ROW(65:90))))&">=0"
要更改开始和结束部分,请更改行号开始和结束部分:
请尝试将范围转换为数组:
QUERY({SomeOtherSheet!A85:BA},"select Col1,Col2,Col3,...")
我总是使用这种方法并通过索引在查询中搜索列,例如查找名为 "Name":
的列=match("Name", SomeOtherSheet!A85:BA85, 0)
更新。合并查询的 OR
部分:
="where Col"&JOIN(" >= 0 or Col",ARRAYFORMULA(COLUMN(O1:Z1)))&" >= 0"
结果是:
"where Col15 >= 0 or Col16 >= 0 or Col17 >= 0 or Col18 >= 0 or Col19 >= 0 or Col20 >= 0 or Col21 >= 0 or Col22 >= 0 or Col23 >= 0 or Col24 >= 0 or Col25 >= 0 or Col26 >= 0"
如果新列将粘贴到 O1:Z1
范围内,则此公式将进行调整。在实际项目中,按点查找范围很有用:起始单元格、最后一个单元格,然后使用 indirect
:
="where Col"&JOIN(" >= 0 or Col",ARRAYFORMULA(COLUMN(indirect(range))))&" >= 0"
其中 range
是带有字符串 "O1:Z1" 的范围名称,"O1" 和 "Z1" 是通过它们的列名或 ID 找到的。