Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bcd0adf81 | ||
|
|
93348ad604 | ||
|
|
7561bb0c39 | ||
|
|
959a9ffab4 | ||
|
|
2348575737 | ||
|
|
b2aac21b90 | ||
|
|
438b1e93d7 | ||
|
|
674737f840 | ||
|
|
150be89246 |
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
@@ -0,0 +1,63 @@
|
||||
---
|
||||
title: 'Full Table Search: Find Any Value in Any Table'
|
||||
description: Type a value into the search box and Data Controller scans every column for it - no query, no WHERE clause.
|
||||
date: '2026-09-15 17:00:00'
|
||||
author: 'Data Controller'
|
||||
authorLink: https://www.linkedin.com/showcase/data-controller-for-sas
|
||||
tags:
|
||||
- Announcements
|
||||
previewImg: './full-table-search.jpeg'
|
||||
---
|
||||
|
||||
# Full Table Search: Find Any Value in Any Table
|
||||
|
||||
Finding a value in a large table usually means writing a query first: guess which column it lives in, write a WHERE clause, run it, and try again when you guess wrong. Data Controller's **full table search** removes that step. Choose a library and table in the Viewer, type a value into the search box and press Enter - every column in the table is scanned for it, and the matching rows come straight back into the grid.
|
||||
|
||||
## How it works
|
||||
|
||||
The search box sits in the Viewer toolbar, next to a **Numeric** checkbox:
|
||||
|
||||
- **Text search** matches part of a value using the case sensitive SAS® `CONTAINS` operator, so `smith` finds `Goldsmith` but not `Smithson`.
|
||||
- **Numeric search** (tick the box) matches the number exactly against every numeric column in the table.
|
||||
|
||||
Whichever you use, the results are ordinary rows in the Viewer, with the rest of the screen behaving exactly as it does for a normal view.
|
||||
|
||||
## Any database, not just SAS datasets
|
||||
|
||||
The scan runs inside SAS, against whichever libname engine the table is assigned to - so it is not limited to SAS datasets.
|
||||
|
||||
## Built on open source
|
||||
|
||||
This feature, like most of Data Controller, is built on the [SASjs Macro Core](https://github.com/sasjs/core) library, using the [`%mp_searchdata()`](https://core.sasjs.io/mp__searchdata_8sas.html) macro. The macro assembles a single DATA step with one `OR` clause per column - a `CONTAINS` test for character columns, an equality test for numeric ones - and writes out only the matching records. It is MIT licensed, so you can read, test and audit the code that is running against your data.
|
||||
|
||||
A few things worth knowing:
|
||||
|
||||
- The search respects your current filter, Row Level Security and Column Level Security - it scans the view you are entitled to see, not the raw table.
|
||||
- Full table search is available in ViewBoxes as well, so the related tables lined up beside your main grid can be searched the same way.
|
||||
- Nothing is shipped to an external index or search service: the scan happens on your own SAS platform.
|
||||
|
||||
See it in action:
|
||||
|
||||
<iframe title="Full Table Search" width="560" height="315" src="https://vid.4gl.io/videos/embed/qdEv4PP2oiPr5VXwLbN58B" style="border: 0px;" allow="fullscreen" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
|
||||
|
||||
More detail in the [Viewer documentation](https://docs.datacontroller.io/dcu-tableviewer/).
|
||||
|
||||
<!--
|
||||
Source LinkedIn post:
|
||||
|
||||
Data Controller for SAS® has a plethora of features to make Data Discovery easier
|
||||
|
||||
Here we demonstrate "full table search". No need to formulate a query - just type a value and hit enter!
|
||||
|
||||
It works on all databases
|
||||
|
||||
This feature, like most others, is built on our open-source #SASjs library - using the `mp_searchdata()` macro (https://lnkd.in/gxZZq76j).
|
||||
|
||||
#sas #sasapps #sasviya
|
||||
|
||||
video: https://vid.4gl.io/w/qdEv4PP2oiPr5VXwLbN58B
|
||||
-->
|
||||
|
||||
<!-- Image prompt:
|
||||
Flat vector illustration on a dark slate (#314351) background with a faint dot grid: a stylised data table across the lower half (rounded header bar plus eight rows of rounded cells), with the fourth row highlighted in brand green (#90c445). A large magnifying glass with a thick green rim and diagonal handle overlaps the table on the right, and inside its dark lens the highlighted row appears magnified with two white value blocks. Headline "FULL TABLE SEARCH" in bold white uppercase, subheading "any value, every column - no query required" in brand green. 1200x627 landscape, no other text. Composed programmatically with PIL in the Data Controller brand palette rather than generated by an image model.
|
||||
-->
|
||||
@@ -21,11 +21,6 @@ const Footer = () => (
|
||||
on <StyledAnchor href="https://sasapps.io">SAS Web Apps</StyledAnchor>
|
||||
.
|
||||
</StyledDesc>
|
||||
<StyledDesc>
|
||||
<StyledAnchor href="https://sasapps.io/cyber-essentials-certified/">
|
||||
Cyber Essentials Certified
|
||||
</StyledAnchor>
|
||||
</StyledDesc>
|
||||
</div>
|
||||
<div className="col-md-3">
|
||||
<StyledHeading>Source Code</StyledHeading>
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import React from 'react'
|
||||
import { Link } from 'gatsby'
|
||||
import { FaShieldAlt } from 'react-icons/fa'
|
||||
|
||||
import { Hero, HeroHeading, HeroDesc, HeroBadge } from './style'
|
||||
import { Hero, HeroHeading, HeroDesc } from './style'
|
||||
import { BottomSectionArrow, OutlineButton } from '../shared/styledComponents'
|
||||
import { Container } from '../shared'
|
||||
|
||||
@@ -20,18 +19,9 @@ const HeroSection: React.FC<HeroSectionProps> = ({
|
||||
<HeroHeading>{heading}</HeroHeading>
|
||||
<HeroDesc>{desc}</HeroDesc>
|
||||
{location.pathname === pathPrefix + '/' && (
|
||||
<>
|
||||
<HeroBadge
|
||||
href="https://sasapps.io/cyber-essentials-certified/"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>
|
||||
<FaShieldAlt /> Cyber Essentials Certified
|
||||
</HeroBadge>
|
||||
<Link to="/contact/">
|
||||
<OutlineButton>Try Data Controller</OutlineButton>
|
||||
</Link>
|
||||
</>
|
||||
<Link to="/contact/">
|
||||
<OutlineButton>Try Data Controller</OutlineButton>
|
||||
</Link>
|
||||
)}
|
||||
</Container>
|
||||
<BottomSectionArrow />
|
||||
|
||||
@@ -17,20 +17,3 @@ export const HeroHeading = styled.h1`
|
||||
export const HeroDesc = styled.p`
|
||||
opacity: 0.8;
|
||||
`
|
||||
|
||||
export const HeroBadge = styled.a`
|
||||
display: block;
|
||||
width: fit-content;
|
||||
margin: 0.75rem 0 0;
|
||||
padding: 0.375rem 1rem;
|
||||
font-size: 0.75rem;
|
||||
border: 2px solid rgba(255, 255, 255, 0.5);
|
||||
border-radius: 0.25rem;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
color: white;
|
||||
border-color: white;
|
||||
opacity: 0.9;
|
||||
}
|
||||
`
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import React from 'react'
|
||||
import { FaShieldAlt } from 'react-icons/fa'
|
||||
import styled from 'styled-components'
|
||||
|
||||
const StyledCertBadge = styled.a`
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.375rem 1rem;
|
||||
font-size: 0.75rem;
|
||||
border: 2px solid #314351;
|
||||
border-radius: 0.25rem;
|
||||
color: #314351;
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
color: white;
|
||||
background-color: #314351;
|
||||
}
|
||||
`
|
||||
|
||||
const CertBadge = () => (
|
||||
<StyledCertBadge
|
||||
href="https://sasapps.io/cyber-essentials-certified/"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>
|
||||
<FaShieldAlt /> Cyber Essentials Certified
|
||||
</StyledCertBadge>
|
||||
)
|
||||
|
||||
export default CertBadge
|
||||
@@ -5,6 +5,7 @@ import Layout from '../components/layout'
|
||||
import Seo from '../components/seo'
|
||||
|
||||
import { Section } from '../components/shared'
|
||||
import CertBadge from '../components/shared/certBadge'
|
||||
import {
|
||||
SectionHeading,
|
||||
SectionDesc
|
||||
@@ -37,6 +38,7 @@ const About: React.FC<PageProps<unknown>> = ({ location }) => {
|
||||
</a>
|
||||
.
|
||||
</SectionDesc>
|
||||
<CertBadge />
|
||||
</div>
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
@@ -7,6 +7,7 @@ import Layout from '../components/layout'
|
||||
import Seo from '../components/seo'
|
||||
|
||||
import { Section, ScheduleDemo } from '../components/shared'
|
||||
import CertBadge from '../components/shared/certBadge'
|
||||
import {
|
||||
SectionHeading,
|
||||
SectionDesc
|
||||
@@ -98,6 +99,7 @@ const Home: React.FC<PageProps<IndexPageData>> = ({ data, location }) => {
|
||||
perform manual data uploads into their preferred database, in
|
||||
real-time, with full validation, approval, security, and control.
|
||||
</SectionDesc>
|
||||
<CertBadge />
|
||||
</div>
|
||||
<div className="col-md-3">
|
||||
<Art src={rightArt} info="Clinical Research Data" />
|
||||
|
||||
Reference in New Issue
Block a user